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

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

7
วิธีจัดรูปแบบวันที่ออกพร้อมช่องว่างเป็นตัวแปรในสคริปต์ได้อย่างไร
ฉันต้องการที่จะทำให้dateคำสั่งด้วยการจัดรูปแบบที่ดีเช่นนี้: $ date +"%Y-%m-%d %H:%M:%S" 2015-09-17 16:51:58 แต่ฉันต้องการบันทึกในตัวแปรดังนั้นฉันสามารถโทรจากสคริปต์เช่นนี้ echo "$(nice_date) [WARNING] etc etc" อย่างไรก็ตามมันไม่ทำงาน $ nice_date="date +%Y-%m-%d %H:%M:%S" $ echo "$($nice_date)" date: extra operand ‘%H:%M:%S’ Try 'date --help' for more information. $ nice_date="date +\"%Y-%m-%d %H:%M:%S\"" $ echo "$($nice_date)" date: extra operand ‘%H:%M:%S"’ Try 'date --help' for more information. $ nice_date='date …
13 bash  date 

2
วิธีการเพิ่มตัวแปรท้องถิ่นใน Bash
ข้อมูล 1 \begin{document} 3 รหัส #!/bin/bash function getStart { local START="$(awk '/begin\{document\}/{ print NR; exit }' data.tex)" echo $START } START2=$(getStart) echo $START2 ซึ่งผลตอบแทนแต่ฉันต้องการ2 3ฉันเปลี่ยนปลายไม่สำเร็จโดยคำตอบนี้เกี่ยวกับฉันจะเพิ่มตัวเลขในสคริปต์ทุบตี : START2=$((getStart+1)) คุณจะเพิ่มตัวแปรโลคอลในสคริปต์ Bash ได้อย่างไร?

3
จะเข้าใจคำสั่ง“ cat> file_name << blah” ได้อย่างไร?
ในคำสั่งต่อไป cat ใช้เนื้อหาของ here-doc และเปลี่ยนเส้นทางไปยังไฟล์ conf: cat &gt; conf &lt;&lt; EOF var1="cat" var2="dog" var3="hamster" EOF จะเข้าใจลำดับของคำสั่งได้อย่างไร bashขั้นตอนแรกจะประมวลผลทุกอย่าง (ที่นี่ส่วน doc) และเป็นขั้นตอนสุดท้ายมันดู&gt; confส่วนหรือไม่

3
ไม่คาดคิด Bash เสร็จสิ้นของ ~ บน OS X
ฉันกด~TabTabบนคำสั่ง bash และได้รับชุดของความสำเร็จที่ไม่คาดคิด ครั้งแรกมันดูเหมือนว่าทุกคนใน/Usersไดเรกทอรีและอีกมากมาย จากนั้นฉันคิดว่ามันกำลังทำการค้นหาแบบย้อนกลับของคนที่มีไดเรกทอรี "home" ใน/etc/passwordหรืออาจจะเป็นคนที่/var/empty- สิ่งนี้ดูเหมือนถูกต้อง สิ่งที่ฉันอยากรู้คือสิ่งที่เกิดขึ้นจริงและทำไมมันใช้งานได้

2
ฝูงสัตว์ & exec ปลอดภัยในการทุบตี?
ตัวอย่างการล็อก "มาตรฐาน" ที่ฉันเห็นมีบางอย่างเช่น ... ( flock -n 200 || exit 1; # do stuff ) 200&gt;program.lock การทดสอบexecณ จุดนั้นปลอดภัยหรือไม่? กระบวนการย่อยจะยังคงล็อคหรือไม่ ( flock -n 200 || exit 1; exec /usr/bin/python vendors-notcoolstuff.py ) 200&gt;program.lock ฉันจำได้ว่ากระบวนการ exec'd จะคงไว้ซึ่งตัวอธิบายไฟล์ที่เปิดอยู่และเนื่องจาก flock ใช้ตัวอธิบายไฟล์มันควรจะทำงานได้ แต่ฉันไม่สามารถหาเอกสารที่ทำให้ชัดเจนและชัดเจนได้ สำหรับเร็กคอร์ดนี่เป็นข้อมูลเฉพาะสำหรับ Linux
13 bash  lock 

4
ข้อผิดพลาด `ls` เมื่อลบไดเรกทอรี
ฉันมีกระสุนสองนัดที่เปิดอยู่ สิ่งแรกคือในไดเรกทอรี A. ในวินาทีฉันลบไดเรกทอรี A แล้วสร้างใหม่ เมื่อฉันกลับไปที่เชลล์ตัวแรกและพิมพ์lsเอาต์พุตคือ: ls: cannot open directory .: Stale file handle ทำไม? ฉันคิดว่าเชลล์แรก (อันที่ยังคงเปิดอยู่ในไดเรกทอรีที่ไม่มีอยู่) จะ "หยุด" ในขณะที่รอคำสั่งถัดไปและจะไม่ "รู้" ว่าไดเรกทอรีนั้นถูกลบและสร้างใหม่ เชลล์เก็บการอ้างอิง "ที่ลึกกว่า" ไปยังไดเร็กทอรีการทำงานปัจจุบันนอกเหนือจากสตริง$PWDหรือไม่?


2
ตัวแปรใช้“ ~” สำหรับ cd'ing ได้อย่างไร
ฉันจะใช้ตัวแปร - $BASEในซีดีของฉันได้อย่างไร ฉันลองสิ่งต่อไปนี้ แต่ฉันได้รับข้อผิดพลาด $ cd ~/z/repo_1_ruby_193/ 23:23:57 durrantm Castle2012 /home/durrantm/z/repo_1_ruby_193 $ BASE="~/z" 23:24:03 durrantm Castle2012 /home/durrantm/z/repo_1_ruby_193 $ cd $BASE/repo_1_ruby_193 -bash: cd: ~/z/repo_1_ruby_193: No such file or directory 23:24:25 durrantm Castle2012 /home/durrantm/z/repo_1_ruby_193

5
ฉันจะเขียนโปรแกรมได้อย่างไรถ้าชื่อไฟล์ตรงกับรูปแบบของเชลล์กลม?
ผมอยากจะบอกว่าสตริงจะตรงตามรูปแบบ $string glob อาจหรืออาจไม่ใช่ชื่อของไฟล์ที่มีอยู่ ฉันจะทำสิ่งนี้ได้อย่างไร$pattern$string สมมติรูปแบบต่อไปนี้สำหรับสตริงอินพุตของฉัน: string="/foo/bar" pattern1="/foo/*" pattern2="/foo/{bar,baz}" ฉันต้องการที่จะหาสำนวนทุบตีที่กำหนดว่า$stringจะได้รับการจับคู่โดย$pattern1, $pattern2หรือรูปแบบ glob พลอื่น ๆ นี่คือสิ่งที่ฉันได้ลองไปแล้ว: [[ "$string" = $pattern ]] เกือบจะใช้งานได้ยกเว้นว่า$patternตีความเป็นรูปแบบสตริงและไม่เป็นรูปแบบแบบกลม [ "$string" = $pattern ] ปัญหาด้วยวิธีนี้คือการที่$patternมีการขยายและจากนั้นเปรียบเทียบสตริงจะดำเนินการระหว่างและการขยายตัวของ$string$pattern [[ "$(find $pattern -print0 -maxdepth 0 2&gt;/dev/null)" =~ "$string" ]] อันนี้ใช้งานได้ แต่เฉพาะถ้า$stringมีไฟล์ที่มีอยู่ [[ $string =~ $pattern ]] สิ่งนี้ไม่ทำงานเนื่องจาก=~โอเปอเรเตอร์ทำให้เกิด$patternการตีความว่าเป็นนิพจน์ปกติแบบขยายไม่ใช่รูปแบบแบบกลมหรือไวด์การ์ด
13 bash  wildcards 

3
เหตุใด [az] เครื่องหมายดอกจันจึงจับคู่หมายเลข
ฉันมี 3 ไดเรกทอรีที่เส้นทางปัจจุบัน $ls a_0db_data a_clean_0db_data a_clean_data $ls a_*_data a_0db_data: a_clean_0db_data: a_clean_data: $ls a_[a-z]*_data a_clean_0db_data: a_clean_data: ผมคาดว่าคำสั่ง ls a_clean_dataสุดท้ายคำสั่งเพื่อให้ตรงเท่านั้น ทำไมถึงยังตรงกับที่มี0? bash --version GNU bash, version 4.2.24(1)-release (i686-pc-linux-gnu)

2
Bash: กระบวนการทดแทนและ stdin
บรรทัดต่อไปนี้ชัดเจน: echo "bla" | foo | bar แต่สิ่งที่อยู่ด้านล่างทำเช่นเดียวกันหรือไม่ echo "bla" | bar &lt;(foo) echo "bla" | bar &lt; &lt;(foo) ข้อใดfooและbarอ่าน "bla" จาก stdin และทำไม ฉันหมายความว่าแน่นอนฉันสามารถเขียนโค้ดและตรวจสอบ แต่ฉันไม่แน่ใจว่าเป็นพฤติกรรมที่กำหนดไว้หรือฉันใช้ประโยชน์จากคุณลักษณะที่ไม่ควรเชื่อถือ

3
Bash เติมข้อความอัตโนมัติด้วยคำสั่ง vim
ใน bash การเติมข้อความอัตโนมัติของเส้นทางเพิ่งหยุดทำงานเมื่อออกvimคำสั่งโดยที่เส้นทางนั้นมีความลึกมากกว่าสองไดเรกทอรี (จะยังคงทำงานตามที่คาดไว้กับคำสั่งอื่นเช่นlsและcd) ตัวอย่างเช่นถ้าฉันพิมพ์ls .config/btsync/btแล้วกด TAB ls .config/btsync/btsync.confจะขยายไป ถ้าผมพิมพ์vim .config/btแล้วกด TAB vim .config/btsync/จะขยายไป อย่างไรก็ตามถ้าฉันพิมพ์vim .config/btsync/btแล้วกด TAB ไม่มีอะไรเกิดขึ้น (ฉันคาดว่าจะขยายvim .config/btsync/btsync.confเป็นlsตัวอย่างเช่นด้านบน ฉันได้รับปัญหาเดียวกันเมื่อทำงานในฐานะผู้ใช้ของตัวเองและเมื่อทำงานเป็น su ฉันอ่านโพสต์นี้ซึ่งกล่าวถึงปัญหาของ bash-completion เวอร์ชั่นเก่า แต่ฉันใช้ 2.1-5 UPDATE: หลังจากการทดสอบเพิ่มเติมฉันพบว่าปัญหารากคือทุบตีจะสมบูรณ์เพียงชื่อไดเรกทอรีไม่ใช่ชื่อไฟล์ UPDATE: ปรากฎว่าbash-completionเป็นสาเหตุโดยรวม ดูความคิดเห็นที่สองของฉันในคำตอบที่ยอมรับ ข้อเสนอแนะเกี่ยวกับสาเหตุที่เป็นไปได้ของพฤติกรรมนี้จะได้รับสุดซึ้ง!

4
ฉันจะจับรหัสทางออก / จัดการผิดได้อย่างถูกต้องเมื่อใช้การทดแทนกระบวนการได้อย่างไร
ฉันมีสคริปต์ที่แยกวิเคราะห์ชื่อไฟล์ลงในอาร์เรย์โดยใช้วิธีการต่อไปนี้ที่นำมาจากQ&amp;A บน SO : unset ARGS ARGID="1" while IFS= read -r -d $'\0' FILE; do ARGS[ARGID++]="$FILE" done &lt; &lt;(find "$@" -type f -name '*.txt' -print0) วิธีนี้ใช้งานได้ดีและจัดการรูปแบบชื่อไฟล์ทุกประเภทได้อย่างสมบูรณ์แบบ อย่างไรก็ตามบางครั้งฉันจะส่งไฟล์ที่ไม่มีอยู่ไปยังสคริปต์เช่น: $ findscript.sh existingfolder nonexistingfolder find: `nonexistingfile': No such file or directory ... ภายใต้สถานการณ์ปกติฉันจะให้สคริปต์จับรหัสออกด้วยสิ่งที่ชอบRET=$?และใช้เพื่อตัดสินใจว่าจะดำเนินการอย่างไร ดูเหมือนจะไม่ทำงานกับการทดแทนกระบวนการด้านบน ขั้นตอนที่ถูกต้องในกรณีเช่นนี้คืออะไร? ฉันจะจับรหัสส่งคืนได้อย่างไร มีวิธีอื่นที่เหมาะสมกว่าหรือไม่ในการพิจารณาว่ามีบางอย่างผิดพลาดในกระบวนการทดแทนหรือไม่

3
ข้อผิดพลาดของสคริปต์ทุบตี: คาดว่าจะเป็นจำนวนเต็ม
ฉันมีปัญหาค่อนข้างแปลกฉันกำลังเรียกใช้สคริปต์ (Bash) บนเซิร์ฟเวอร์หลายเครื่องและหยุดทำงานกับเซิร์ฟเวอร์ตัวใดตัวหนึ่ง (ใช้งานได้ดีกับเซิร์ฟเวอร์อื่นทั้งหมด) นี่คือส่วนปัญหาของสคริปต์: (ฉันไม่ได้เขียนด้วยตัวเองเครดิตทั้งหมดไปที่ "รวย") ( http://www.notrainers.org/monitoring-memory-usage-on-linux-with-nagios-) and-nrpe / ) if [ "$result" -lt "$warn_level" ]; then #Line 56 echo "Memory OK. $result% used." exit 0; elif [ "$result" -ge "$warn_level" ] &amp;&amp; [ "$result" -le "$critical_level" ]; then #Line 59 echo "Memory WARNING. $result% used." exit 1; …
13 bash 


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