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

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

7
ฉันควรใช้เชลล์ตัวใด - tcsh vs bash? [ปิด]
ฉันใช้tcshงานมานานแล้ว แต่เมื่อใดก็ตามที่ฉันกำลังค้นหาบางอย่างฉันมักพบว่าวิธีการที่ระบุนั้นbashเฉพาะเจาะจง แม้แต่ไวยากรณ์สำหรับเชลล์สคริปต์ก็ยังแตกต่างกันสำหรับทั้งสอง จากสิ่งที่ฉันมีประสบการณ์การค้นหาและการเรียนรู้บนอินเทอร์เน็ตbashดูเหมือนจะเป็นเปลือกที่ใช้บ่อยขึ้น แม้จำนวนของคำถามในเว็บไซต์นี้มีแท็กbashเป็นวิธีที่มากขึ้น (ห้าครั้งในขณะนี้) tcshกว่าจำนวนของคำถามที่ถูกแท็ก ดังนั้นฉันสงสัยว่าฉันควรเปลี่ยนเป็นทุบตี คุณคิดอย่างไร? ทำไมฉันถึงติดtcshหรือทำไมฉันจึงควรย้ายไปที่bash?
30 linux  shell  bash  fedora  tcsh 

5
ตรวจสอบว่า $ REPLY อยู่ในช่วงตัวเลขหรือไม่
ฉันเขียนเชลล์สคริปต์สำหรับ Linux โดยใช้ Bash เพื่อแปลไฟล์วิดีโอใด ๆ ให้เป็น MP4 สำหรับสิ่งที่ฉันใช้avconvกับlibvorbisเสียง ภายในสคริปต์ของฉันฉันมีคำถามสำหรับผู้ใช้: read -p "- Audio Quality [scale from -2 to 10] ? " if [ -n "$REPLY" ] ; then ABITRATE="-aq $REPLY" fi สตริง "ABITRATE" ของฉันเข้าสู่avconvบรรทัดคำสั่งสุดท้าย แต่ฉันต้องการให้ผู้ใช้มีโอกาสตอบคำถามนั้นด้วยค่าเป็น Kb (Kilobit) และแปลเป็นมาตราส่วนที่libvorbisใช้ "สเกลจาก -2 ถึง 10" คือ: Quality Kbit/s Normalization ----------------------------- -2 ~32 …

5
ป้องกัน grep ไม่ให้ออกในกรณีที่มีการระบุชื่อ
สคริปต์นี้ไม่ได้สะท้อน "หลัง": #!/bin/bash -e echo "before" echo "anything" | grep e # it would if I searched for 'y' instead echo "after" exit และถ้าฉันลบ-eตัวเลือกในบรรทัด shebang ออก แต่ฉันต้องการเก็บไว้เพื่อให้สคริปต์ของฉันหยุดทำงานหากมีข้อผิดพลาด ฉันไม่คิดว่า grep ไม่พบการจับคู่เป็นข้อผิดพลาด ฉันจะป้องกันไม่ให้ออกโดยทันทีได้อย่างไร

2
#: 3 หมายถึงอะไรในคำสั่งเชลล์
คู่มือการติดตั้งสำหรับ ack แนะนำให้ติดตั้งสคริปต์ ack โดยใช้คำสั่งนี้: curl http://beyondgrep.com/ack-2.14-single-file > ~/bin/ack && chmod 0755 !#:3 ฉันคิดว่า!#:3ท้ายที่สุดก็คือการอ้างอิงย้อนกลับบางอย่าง แต่มันหมายถึงอะไร? มีเทียบเท่าใน zsh หรือไม่ Google ไม่ได้มีประโยชน์

8
มีบางอย่างผิดปกติกับสคริปต์ของฉันหรือ Bash นั้นช้ากว่า Python มาก?
ฉันกำลังทดสอบความเร็วของ Bash และ Python โดยใช้การวนซ้ำ 1 พันล้านครั้ง $ cat python.py #!/bin/python # python v3.5 i=0; while i<=1000000000: i=i+1; รหัสทุบตี: $ cat bash2.sh #!/bin/bash # bash v4.3 i=0 while [[ $i -le 1000000000 ]] do let i++ done การใช้timeคำสั่งฉันพบว่ารหัส Python ใช้เวลาเพียง 48 วินาทีในการทำให้เสร็จในขณะที่รหัส Bash ใช้เวลานานกว่า 1 ชั่วโมงก่อนที่ฉันจะฆ่าสคริปต์ ทำไมเป็นเช่นนี้ ฉันคาดว่า Bash จะเร็วขึ้น …
29 bash  python3 

1
เหตุใดการแทนที่กระบวนการ BASH จึงไม่ทำงานกับคำสั่งบางอย่าง
ในบางโอกาสการทดแทนกระบวนการจะไม่ทำงานตามที่คาดไว้ นี่คือตัวอย่าง: การป้อนข้อมูล: gcc <(echo 'int main(){return 0;}') เอาท์พุท: /dev/fd/63: file not recognized: Illegal seek collect2: error: ld returned 1 exit status การป้อนข้อมูล: แต่มันทำงานได้อย่างที่คาดไว้เมื่อใช้กับคำสั่งอื่น: grep main <(echo 'int main(){return 0;}') เอาท์พุท: int main(){return 0;} ฉันได้สังเกตเห็นความล้มเหลวที่คล้ายกันกับคำสั่งอื่น ๆ (เช่นคำสั่งคาดหวังว่าไฟล์จากการทดแทนกระบวนการไม่สามารถใช้/dev/fd/63หรือคล้ายกัน) ความล้มเหลวด้วยgccนี้เป็นเพียงล่าสุด มีกฎทั่วไปบางอย่างที่ฉันควรทราบเพื่อกำหนดว่าเมื่อใดการทดแทนกระบวนการจะล้มเหลวด้วยวิธีนี้และไม่ควรใช้? ฉันใช้ BASH รุ่นนี้บน Ubuntu 12.04 (ฉันเคยเห็นใน arch และ debian): GNU bash, …

3
ฉันจะดูบรรทัดคำสั่งที่แน่นอนถูกเรียกใช้งานในอินสแตนซ์ของ bash ได้อย่างไร
ฉันมีbashอินสแตนซ์ที่ใช้เวลานาน(ภายในscreenเซสชัน) ที่กำลังดำเนินการชุดคำสั่งที่ซับซ้อนภายในลูป บรรทัดคำสั่งยาวเขียนอยู่ในเทอร์มินัล - มันไม่ได้อยู่ในสคริปต์ใด ๆ ตอนนี้ฉันรู้รหัสกระบวนการทุบตีและฉันมีการเข้าถึงรูท - ฉันจะดูบรรทัดคำสั่งที่ถูกดำเนินการภายในได้bashอย่างไร ตัวอย่าง bash$ echo $$ 1234 bash$ while true ; do \ someThing | somethingElse 2>/foo/bar | \ yetAnother ; sleep 600 ; done และในอินสแตนซ์ของเชลล์อื่นฉันต้องการดูบรรทัดคำสั่งที่ดำเนินการภายใน PID 1234: bash$ echo $$ 5678 bash$ su - sh# cd /proc/1234 sh# # Do something here …


7
วิธีการทำให้ Bash ทำงานหลังจากสั่งงาน
ฉันต้องการเรียกใช้บางสิ่งเช่นนี้: bash -c "some_program with its arguments" แต่เพื่อให้มีการทุบตีแบบโต้ตอบให้ทำงานหลังจากsome_programสิ้นสุด ฉันแน่ใจว่า-cไม่ใช่วิธีที่ดีเหมือนman bashseys: เชลล์เชิงโต้ตอบเริ่มต้นหนึ่งโดยไม่มีอาร์กิวเมนต์ที่ไม่ใช่ตัวเลือกและไม่มีตัวเลือก -c ดังนั้นจะทำอย่างไร เป้าหมายหลักอธิบายไว้ที่นี่ บันทึก ฉันจำเป็นต้องยกเลิกsome_programเป็นครั้งคราว ฉันไม่ต้องการให้มันเป็นพื้นหลัง ฉันอยากอยู่ต่อbashไปเพื่อทำอย่างอื่น ฉันต้องการที่จะสามารถเรียกใช้โปรแกรมอีกครั้ง
29 bash 

6
ไพพ์ไปยังหลายไฟล์ในเชลล์
ฉันมีแอปพลิเคชั่นซึ่งจะสร้างข้อมูลจำนวนมากซึ่งฉันไม่ต้องการจัดเก็บลงดิสก์ แอปพลิเคชั่นส่วนใหญ่ส่งออกข้อมูลที่ฉันไม่ต้องการใช้ แต่เป็นชุดข้อมูลที่มีประโยชน์ที่ต้องแยกเป็นไฟล์แยกต่างหาก ตัวอย่างเช่นกำหนดเอาต์พุตต่อไปนี้: JUNK JUNK JUNK JUNK A 1 JUNK B 5 C 1 JUNK ฉันสามารถเรียกใช้แอปพลิเคชันได้สามครั้งดังนี้: ./app | grep A > A.out ./app | grep B > B.out ./app | grep C > C.out นี่จะทำให้ฉันได้สิ่งที่ฉันต้องการ แต่ใช้เวลานานเกินไป ฉันไม่ต้องการดัมพ์เอาต์พุตทั้งหมดไปยังไฟล์เดียวและวิเคราะห์คำนั้น มีวิธีใดบ้างที่จะรวมการดำเนินการทั้งสามที่แสดงไว้ด้านบนในลักษณะที่ฉันจะต้องเรียกใช้แอปพลิเคชันเพียงครั้งเดียวและยังคงได้รับไฟล์เอาต์พุตสามไฟล์
29 bash  shell  grep  pipe 

1
ทุบตีคำสั่งกรณีน้ำตกทั้งหมด?
ฉันพยายามทำสิ่งนี้: case $level in 3) echo "Level Three" 2) echo "Level Two" 1) echo "Level one" ;; esac โดยที่ถ้าระดับ $ = 3 มันจะส่งออก Level Three Level Two Level One ในขณะที่ถ้า $ level = 1 มันจะออกเท่านั้น Level One แต่เมื่อผมลองแล้วฉันจะได้รับข้อผิดพลาดเพราะผมไม่ได้รวมsyntax error near unexpected token ')';; ทุกภาษาที่ฉันรู้จักอนุญาตให้ทำสิ่งนี้มีวิธีที่จะทำได้ในการทุบตีหรือไม่? คำหลักบางประเภทที่หมายถึง "ตอนนี้ไปและทำกรณีถัดไปราวกับว่ามันตรงกับ"?

6
ฉันจะสร้างนามแฝงสำหรับคำสั่ง git [action] (ซึ่งมีช่องว่าง) ได้อย่างไร
นามแฝงของฉันส่วนใหญ่เป็นของแบบฟอร์มนี้: alias p='pwd' ฉันต้องการนามแฝงgit commitเพื่อที่จะทำgit commit -v แต่การพยายามสร้างนามแฝงที่มีช่องว่างทำให้เกิดข้อผิดพลาด: $ alias 'git commit'='git commit -v' -bash: alias: `git commit': invalid alias name
29 bash  shell  terminal  alias  git 


4
ฉันจะบันทึกคำสั่งสุดท้ายไปยังไฟล์ได้อย่างไร?
เมื่อฉันใช้การวิเคราะห์โดยใช้ bash shell ฉันมักจะต้องการบันทึกคำสั่งที่ฉันใช้ซึ่งให้ผลลัพธ์ที่ดีกับไฟล์ในไดเรกทอรีเดียวกัน ("LOGBOOK" ของฉันซึ่งเรียกว่า) เพื่อให้ฉันสามารถตรวจสอบสิ่งที่ ฉันได้รับผลลัพธ์เหล่านั้น จนถึงตอนนี้มีความหมายว่าฉันทั้ง copy.pasting คำสั่งจาก terminal หรือกด "up" การปรับเปลี่ยนคำสั่งเป็นecho"my command" >> LOGBOOKหรือการแสดงตลกที่คล้ายกันอื่น ๆ ผมพบว่ามีhistoryเครื่องมือในวันอื่น ๆ getlast >> LOGBOOKแต่ฉันไม่สามารถหาวิธีการใช้มันเพื่อให้ได้คำสั่งดำเนินการก่อนหน้านี้เพื่อที่ฉันสามารถทำสิ่งที่ต้องการ มีวิธีง่าย ๆ ที่ดีในการทำเช่นนี้ หรือมิฉะนั้นคนอื่น ๆ จะจัดการกับการบันทึกคำสั่งสำหรับผลลัพธ์ที่ได้อย่างไร

3
bash คำสั่งหลายบรรทัดพร้อมกับข้อคิดเห็นหลังจากอักขระต่อเนื่อง
พิจารณา echo \ # this is a comment foo สิ่งนี้ให้: $ sh foo.sh # this is a comment foo.sh: line 2: foo: command not found หลังจากค้นหาบนเว็บฉันพบวิธีแก้ปัญหาโดย DigitalRossใน Stack Overflow ของเว็บไซต์น้อง ดังนั้นเราสามารถทำได้ echo `: this is a comment` \ foo หรืออีกวิธีหนึ่ง echo $(: this is a comment) \ foo อย่างไรก็ตาม DigitalRoss …
29 bash  shell 

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