คำถามติดแท็ก bash

คำถามเฉพาะของ Bourne อีกครั้งของเชลล์ใน GNU เมื่อเทียบกับเชลล์ Bourne / POSIX อื่น ๆ สำหรับคำถามเกี่ยวกับเชลล์ Unix โดยทั่วไปให้ใช้ / เชลล์แท็กแทน

2
เหตุใด printf“ umlaut” umlaut?
ถ้าฉันรันสคริปต์ง่าย ๆ ต่อไปนี้: #!/bin/bash printf "%-20s %s\n" "Früchte und Gemüse" "foo" printf "%-20s %s\n" "Milchprodukte" "bar" printf "%-20s %s\n" "12345678901234567890" "baz" มันพิมพ์: Früchte und Gemüse foo Milchprodukte bar 12345678901234567890 baz นั่นคือข้อความที่มีเครื่องหมาย umlauts (เช่นü) คือ "หด" โดยอักขระหนึ่งตัวต่อ umlaut แน่นอนฉันมีการตั้งค่าผิดบางแห่ง แต่ฉันไม่สามารถคิดได้ว่าจะเป็นแบบไหน สิ่งนี้จะเกิดขึ้นหากการเข้ารหัสไฟล์เป็น UTF-8 หากฉันเปลี่ยนการเข้ารหัสเป็น latin-1 การจัดตำแหน่งนั้นถูกต้อง แต่ umlauts แสดงผลไม่ถูกต้อง: Fr�chte und Gem�se …
54 bash  unicode  printf 

10
bash: ทดสอบว่า $ WORD อยู่ในชุดหรือไม่
ฉันกำลังมองหาโครงสร้างในbashการตัดสินใจว่าตัวแปร$WORDเป็นหนึ่งในคำที่กำหนด ฉันต้องการสิ่งนี้: if "$WORD" in dog cat horse ; then echo yes else echo no fi ทุบตีมีโครงสร้างเช่นนี้? ถ้าไม่สิ่งที่จะใกล้เคียงที่สุด?


3
รีเฟรช alias และฟังก์ชั่นใหม่หลังจากกำหนด alias และฟังก์ชั่นใหม่หรือไม่?
เมื่อฉันกำหนดนามแฝงใหม่ใน.bash_aliasesไฟล์หรือฟังก์ชั่นใหม่ใน.bashrcไฟล์มีคำสั่งรีเฟรชที่จะสามารถใช้นามแฝงหรือฟังก์ชั่นใหม่ได้ทันทีโดยไม่ต้องปิดเทอร์มินัล (ในกรณีของฉัน xfce4 เทอร์มินัล และในระหว่างการทำงาน)

6
วิธีคัดลอกไฟล์บางไฟล์ แต่ไม่ใช่ทั้งหมด?
ดังนั้นคุณสามารถใช้*เป็นบัตรเสริมสำหรับไฟล์ทั้งหมดเมื่อใช้cpภายในบริบทของไดเรกทอรี มีวิธีการคัดลอกไฟล์ทั้งหมดยกเว้นxไฟล์หรือไม่
54 bash  shell  wildcards 

2
มีวิธีใดบ้างที่จะเปิดใช้งาน Ctrl + L เพื่อล้างหน้าจอเมื่อตั้งค่า 'set -o vi' หรือไม่
เมื่อคุณกดCtrl+ Lในโหมดทุบตีเริ่มต้นหน้าจอจะถูกล้าง แต่เมื่อฉันเรียกใช้set -o viและกดCtrl+ Lการกดแป้นพิมพ์จะถูกพิมพ์ ( ^L) มีวิธีใดบ้างที่จะรักษาพฤติกรรมนี้
54 bash  readline  vi-mode 

6
การเชื่อมโยงสองตัวแปรเข้ากับขีดล่าง
ฉันต้องต่อตัวแปรสองตัวเข้าด้วยกันเพื่อสร้างชื่อไฟล์ที่มีเครื่องหมายขีดล่าง ให้เรียกตัวแปรของฉัน$FILENAMEและ$EXTENSIONอ่านชื่อไฟล์จากไฟล์ FILENAME=Hello EXTENSION=WORLD.txt ตอนนี้ ... ฉันได้ลองทำสิ่งต่อไปนี้โดยไม่ประสบความสำเร็จ: NAME=${FILENAME}_$EXTENSION NAME=${FILENAME}'_'$EXTENSION NAME=$FILENAME\\_$EXTENSION ฉันมักจะได้ผลลัพธ์ที่แปลก ๆ โดยทั่วไปแล้วจะขีดเส้นใต้ก่อน ฉันต้องการมัน echo $NAME Hello_WORLD.txt

5
การแยกสตริงโดยการเกิดขึ้นครั้งแรกของตัวคั่น
ฉันมีสตริงในรูปแบบถัดไป id;some text here with possible ; inside และต้องการที่จะแยกมันถึง 2 ;สายโดยเกิดขึ้นครั้งแรกของ ดังนั้นควร: idและsome text here with possible ; inside ฉันรู้วิธีแยกสตริง (ตัวอย่างเช่นด้วยcut -d ';' -f1) แต่มันจะแยกส่วนเพิ่มเติมเนื่องจากฉันมี;อยู่ในส่วนด้านซ้าย

3
ฉันจะทำให้ตัวแปรสภาพแวดล้อม“ ส่งออก” ใน shell script ติดรอบได้อย่างไร
ฉันมีบัญชี Amazon EC2 หลายบัญชีและต้องการเปลี่ยนตัวแปรอย่างรวดเร็วเช่นการ$EC2_HOMEใช้สคริปต์ ฉันได้ตั้งค่าสคริปต์เชลล์เช่นนี้: #!/bin/sh export EC2_HOME=/home/me/.ec2 echo $EC2_HOME เมื่อฉันเรียกใช้สคริปต์ฉันรู้ว่าEC2_HOMEมีการตั้งค่า แต่ฉันคิดว่าการใช้exportจะทำให้ตัวแปรติดรอบหลังจากสคริปต์เสร็จสมบูรณ์ มันไม่ได้ทำงานเหมือนecho $EC_HOMEไม่แสดงอะไรเลย ฉันรู้ว่านี่ต้องเป็นความรู้พื้นฐานเกี่ยวกับการเขียนสคริปต์ Linux แต่ฉันไม่รู้ ฉันพยายามหาคำถามที่เกี่ยวข้องโดยไม่มีโชค - ดังนั้นฉันจึงขอโทษถ้ามันซ้ำกัน

2
สร้าง symlink - เขียนทับหากมีอยู่
ฉันต้องการลบข้อมูล/path/to/data/folder/month/date/hour/minute/fileและเชื่อมโยงไปยัง/path/to/recent/fileและทำสิ่งนี้โดยอัตโนมัติทุกครั้งที่มีการสร้างไฟล์ สมมติว่าฉันจะไม่ทราบล่วงหน้าถ้า/path/to/recent/fileมีอยู่ฉันจะสร้างมันขึ้นมาอย่างไร (ถ้าไม่มี) หรือแทนที่ (ถ้ามี) ฉันแน่ใจว่าฉันสามารถตรวจสอบว่ามันมีอยู่แล้วทำการลบ symlink แต่ฉันสงสัยว่ามีคำสั่งง่ายๆที่จะทำสิ่งที่ฉันต้องการในขั้นตอนเดียว
54 bash  symlink 

9
ฉันจะสะท้อนเอาต์พุต 1 คอลัมน์จากคำสั่ง ls ได้อย่างไร
ให้พูดเมื่อฉันทำคำสั่ง ls ผลลัพธ์คือ: file1 file2 file3 file4 เป็นไปได้หรือไม่ที่จะแสดงเฉพาะคอลัมน์ของเอาต์พุตในกรณีนี้ file2? ฉันได้ลองทำสิ่งต่อไปนี้โดยไม่ประสบความสำเร็จ: echo ls | $2 โดยพื้นฐานทั้งหมดที่ฉันต้องการทำคือ echo เฉพาะคอลัมน์ที่สองในกรณีนี้ฉันต้องการ echo: file2
54 bash  ls  parameter  arguments 

5
วิธีการทำคำสั่ง if จากผลลัพธ์ของคำสั่งที่เรียกใช้งาน
ฉันกำลังพยายามทำคำสั่ง IF จากผลลัพธ์ของคำสั่งที่เรียกใช้งาน นี่คือวิธีที่ฉันพยายามทำ แต่ไม่ได้ผล ไม่มีใครรู้วิธีที่ถูกต้องในการทำเช่นนี้? if [ "`netstat -lnp | grep ':8080'`" == *java* ]; then echo "Found a Tomcat!" fi

4
อักขระตัวแทน Bash star * จะสร้างรายการเรียงลำดับ (จากน้อยไปหามาก) เสมอหรือไม่
ฉันมีไดเรกทอรีที่เต็มไปด้วยไฟล์ที่มีชื่ออย่างlogXXที่ XX เป็นเลขฐานสองตัวอักขระสองตัวไม่มีเลขศูนย์ตัวพิมพ์ใหญ่เช่น: log00 log01 log02 ... log0A log0B log0C ... log4E log4F log50 ... โดยทั่วไปจะมีจำนวนไฟล์รวมน้อยกว่า 20 หรือ 30 ไฟล์ วันที่และเวลาในระบบของฉันไม่ใช่สิ่งที่สามารถพึ่งพาได้ (ระบบฝังตัวที่ไม่มีแหล่งเวลา NTP หรือ GPS ที่เชื่อถือได้) อย่างไรก็ตามชื่อไฟล์จะเพิ่มขึ้นอย่างน่าเชื่อถือดังที่แสดงไว้ด้านบน ฉันต้องการgrepผ่านไฟล์ทั้งหมดสำหรับรายการบันทึกล่าสุดบางประเภทฉันหวังว่าจะcatรวมไฟล์เข้าด้วยกันเช่น ... cat /tmp/logs/log* | grep 'WARNING 07 -' | tail -n1 แต่มันเกิดขึ้นกับผมว่ารุ่นที่แตกต่างกันของbashหรือshหรือzshอื่น ๆ อาจจะมีความคิดที่แตกต่างกันเกี่ยวกับวิธีการที่*จะขยายตัว man bashหน้าไม่ได้บอกหรือไม่ว่าการขยายตัวของ*จะเป็นรายชื่อเรียงตามตัวอักษรแน่นอนขึ้นชื่อไฟล์ที่ตรงกัน ดูเหมือนว่าจะเพิ่มขึ้นทุกครั้งที่ฉันลองใช้กับระบบทั้งหมดที่ฉันมีให้ - แต่มันเป็นพฤติกรรมที่กำหนดไว้หรือเพียงแค่การนำไปใช้งานโดยเฉพาะ กล่าวอีกนัยหนึ่งฉันสามารถพึ่งพาcat /tmp/logs/log*การเชื่อมต่อไฟล์บันทึกทั้งหมดของฉันด้วยกันตามลำดับตัวอักษรได้หรือไม่?
53 bash  shell  wildcards 

6
มีเหตุผลใดบ้างที่จะต้องมี shebang ชี้ไปที่ / bin / sh แทนที่จะเป็น / bin / bash?
ในส่วนเชลล์สคริปต์ที่ผมเคยเห็น (นอกเหนือจากคนที่ฉันไม่ได้เขียนตัวเอง) ผมสังเกตเห็นว่า shebang #!/bin/shมีการตั้งค่า นี่ไม่ได้ทำให้ฉันแปลกใจกับสคริปต์เก่า ๆ แต่มันก็มีสคริปต์ใหม่ ๆ มีเหตุผลในการเลือก/bin/shมากกว่า/bin/bashเนื่องจากbashแพร่หลายมากและมักจะเริ่มต้นในเครื่อง Linux และ BSD จำนวนมากจะกลับมาดีกว่าทศวรรษ?
53 bash  shell  history  shebang 

4
ยกเว้นหนึ่งรูปแบบจากการจับคู่แบบกลม
ฉันมีหลายไฟล์ที่มีชื่อไฟล์ฐานเดียวกัน ฉันต้องการลบทั้งหมดยกเว้นหนึ่งรายการ foo.org #keep foo.tex #delete foo.fls #delete foo.bib #delete etc หากฉันไม่ต้องการเก็บไว้ฉันรู้ว่าฉันสามารถrm foo.*ใช้ได้ TLDPสาธิต^การคัดค้านการแข่งขัน จากการทดลองและข้อผิดพลาดฉันสามารถค้นพบสิ่งนั้นได้ rm foo.*[^org] ทำในสิ่งที่ฉันต้องการ แต่ฉันไม่เข้าใจไวยากรณ์ นอกจากนี้ในขณะที่ไม่ได้เป็นข้อ จำกัด ในกรณีที่ใช้งานของฉันฉันคิดว่ารูปแบบนี้ยังไม่สนใจและfoo.o foo.orรูปแบบนี้ทำงานอย่างไรและรูปทรงแบบใดที่ละเว้นเพียง foo.orgดูเหมือน
53 bash  wildcards 

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.