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

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

2
นับจำนวนองค์ประกอบในอาร์เรย์ทุบตีที่ชื่อของอาร์เรย์เป็นแบบไดนามิก (เช่นเก็บไว้ในตัวแปร)
คำชี้แจงสั้น ๆ ของคำถาม: มีวิธีการทุบตีในตัวเพื่อนับจำนวนขององค์ประกอบในอาร์เรย์ทุบตีที่ชื่อของอาร์เรย์เป็นแบบไดนามิก (เช่นเก็บไว้ในตัวแปร) โดยไม่ต้องหันไปทำสำเนาอย่างเต็มที่ของอาร์เรย์หรือใช้eval? ข้อมูลมากกว่านี้: การใช้การแทนที่พารามิเตอร์ bash สามารถทำได้ดังนี้: myArr=(A B C); echo ${#myArr[@]}กำหนดความยาวของอาร์เรย์: การอ้างอิงตัวแปรทางอ้อมโดยใช้ชื่อ: NAME=myVar; echo ${!NAME}(สิ่งนี้ยังใช้กับองค์ประกอบอาร์เรย์): NAME=myArr[1]; echo ${!NAME} แต่ถ้าชื่อของอาเรย์ถูกเก็บไว้ในตัวแปรอีกตัวหนึ่งจะกำหนดจำนวนขององค์ประกอบในอาเรย์ได้อย่างไร? (หนึ่งอาจพิจารณาว่าเป็นการรวมกันของการแทนที่พารามิเตอร์สองตัวด้านบน) ตัวอย่างเช่น: myArr=(A B C D) NAME=myArr # Get the number of elements in the array indirectly referenced by NAME. count=${#$NAME[@]} # This syntax is invalid. What …

1
วงเล็บเดียวในการกำหนดตัวแปร bash
ฉันสงสัยเกี่ยวกับวงเล็บเดี่ยวในทุบตี ฉันรู้ว่าพวกเขาจะใช้สำหรับการดำเนินการคำสั่งใน subshells และพวกเขาจะใช้สำหรับการสร้างอาร์เรย์ แต่พวกเขาจะใช้เพื่ออะไรอย่างอื่น? สิ่งหนึ่งที่ดึงดูดความสนใจของฉันคือเมื่อคุณใช้ในการกำหนดตัวแปรเช่น var=(hello) echo $var # hello ทุบตีไม่ได้สร้างข้อผิดพลาดหรืออะไรและผลลัพธ์จะเหมือนกับว่า var=hello นิยามตัวแปรทั้งสองนี้เหมือนกันหรือมีความแตกต่างกันหรือไม่?
11 bash  array 

2
ซอมบี้ในทุบตี
Bash ดูเหมือนจะไม่สร้างซอมบี้ ดูเหมือนว่ากระบวนการจะเก็บเกี่ยวได้ทันทีเมื่อถูกฆ่า ฉันสามารถทุบตีทำให้ซอมบี้ได้หรือไม่? ทำไมฉันถาม: ฉันต้องการที่จะสามารถฆ่ากระบวนการของเด็กได้อย่างปลอดภัยหรือปลอดภัยkill -9หากไม่ได้ตายภายในระยะเวลาหนึ่ง แต่ฉันไม่ต้องการเผลอทำกระบวนการที่ไม่ใช่กระบวนการลูกของฉันโดยไม่ตั้งใจ กระบวนการซอมบี้มักจะทำให้ง่ายและปลอดภัยต่อสภาพการแข่งขัน
11 bash  process 

2
Bash:“ หมายเลขประวัติ” เทียบกับ“ หมายเลขคำสั่ง”
ในขณะที่ Googling วิธีปรับแต่ง shell prompt ของฉันผ่านตัวแปร PS1 ฉันเห็นตารางของอักขระพิเศษที่สามารถใช้ได้ โดยเฉพาะอย่างยิ่ง: \! the history number of this command \# the command number of this command ดูเหมือนว่า "หมายเลขประวัติ" จะใช้บ่อยกว่าและฉันรู้วิธีใช้คำสั่งเช่น!523ทำคำสั่งซ้ำจากประวัติ แต่ฉันไม่สามารถเข้าใจได้ว่า "หมายเลขคำสั่ง" มีฟังก์ชั่นที่คล้ายกันหรือไม่ ฉันได้ลองใส่\#ตัวแปร PS1 ของฉันแล้วและดูเหมือนว่าจะส่งออกจำนวนคำสั่งที่ป้อนในเซสชันหนึ่ง (ซึ่งต่างจาก\!ที่มีอยู่หลังจากออกจากระบบ / ออก) ใครรู้วิธีใช้ "หมายเลขคำสั่ง" อย่างสะดวกหรือมีความหมาย?

4
ทำความเข้าใจกับการทดแทนคำสั่ง Read-a-File ของ Bash
ฉันพยายามเข้าใจว่า Bash ปฏิบัติต่อบรรทัดต่อไปนี้อย่างไร: $(< "$FILE") ตามหน้า Bash man นี่เทียบเท่ากับ: $(cat "$FILE") และฉันสามารถทำตามบรรทัดของการให้เหตุผลสำหรับบรรทัดที่สองนี้ Bash ดำเนินการขยายตัวตัวแปร$FILEเข้าสู่การทดแทนคำสั่งส่งค่า$FILEถึงcatcat ส่งออกเนื้อหาของ$FILEไปยังเอาต์พุตมาตรฐานการแทนที่คำสั่งเสร็จสิ้นโดยแทนที่ทั้งบรรทัดด้วยเอาต์พุตมาตรฐานที่เป็นผลมาจากคำสั่งด้านในและ Bash พยายามดำเนินการเช่นนั้น คำสั่งง่ายๆ อย่างไรก็ตามสำหรับบรรทัดแรกที่ฉันกล่าวถึงข้างต้นฉันเข้าใจว่า: Bash ทำการแทนที่ตัวแปรใน$FILEBash เปิด$FILEสำหรับการอ่านในอินพุตมาตรฐานอินพุตมาตรฐานจะถูกคัดลอกไปยังเอาต์พุตมาตรฐานการทดแทนคำสั่งเสร็จสิ้นและ Bash พยายามเรียกใช้มาตรฐานที่เป็นผลลัพธ์ เอาท์พุต ใครช่วยอธิบายให้ฉันฟังได้ว่าเนื้อหาของการเปลี่ยน$FILEจาก stdin เป็น stdout ได้อย่างไร?


4
รับ PID ของคำสั่งใด ๆ ในลำดับของ piped ของคำสั่ง
ถ้า, ในbash, ฉันเรียกใช้งาน: cmd1 | cmd2 | ... | cmdi | ... | cmdn & ในกรณีที่cmd{1..n}ไม่ชัดเจนฉันจะได้รับ PID ได้cmdiอย่างไร อีกวิธีหนึ่งฉันจะส่งสัญญาณcmdiกระบวนการได้อย่างไร (ตัวอย่างเช่นส่งSIGUSR1?) pkill/ pgrep, pidofฯลฯ ดูไม่เหมือนคำตอบที่ดีเนื่องจากกรณีอื่น ๆcmdiอาจจะทำงานรวมทั้งเป็นส่วนหนึ่งของท่อเดียวกัน jobs -pให้ PID ของcmd1สำหรับฉัน i{1..n}สามารถเป็นอะไรก็ได้ใน
11 bash  shell  pipe  job-control 

4
zsh และ mksh ไม่สามารถใช้ร่วมกับ bash ได้
เชลล์อื่นที่ทำงานร่วมกันได้ของ POSIX สามารถทำงานแทนกันได้อย่างเหมาะสมสำหรับทุบตีอย่างไร พวกเขาไม่จำเป็นต้องแทนที่ "drop-in" จริง แต่ใกล้พอที่จะทำงานกับสคริปต์ส่วนใหญ่และสนับสนุนส่วนที่เหลือด้วยการปรับเปลี่ยนบางอย่าง ฉันต้องการมีสคริปต์ทุบตีอย่างชัดเจน - initscripts, สคริปต์ไคลเอนต์ DHCP และอื่น ๆ - ทำงานด้วยการปรับเปลี่ยนเล็กน้อย ฉันต้องการคอลเลกชันของเชลล์สคริปต์พิเศษที่ไม่ต้องการการดัดแปลงมากเกินไป ฉันต้องการมีคุณสมบัติเช่นการจัดการสตริงและการจับคู่รูปแบบ regex ในตัว คู่แข่งที่ร้ายแรงเท่านั้นที่ฉันรู้จักคือ zsh และ mksh ดังนั้นสำหรับพวกคุณที่นี่ที่ดีทั้งหรือทั้งสอง: bash มีคุณสมบัติใดบ้างที่ zsh และ mksh ตามลำดับไม่มี? คุณสมบัติใดที่เชลล์ใช้ร่วมกับ bash แต่ใช้ไวยากรณ์ที่เข้ากันไม่ได้
11 bash  zsh  mksh 

3
การรับ PID ของคำสั่งก่อนหน้านี้ใน Pipeline
ฉันกำลังเขียนสคริปต์ทุบตีเพื่อใช้inotifywaitในการตรวจสอบไดเรกทอรีและเริ่มดำเนินการเมื่อตรวจพบการเปลี่ยนแปลง สิ่งที่ต้องการ: inotifywait -m ... | while read f; do something; done เนื่องจากinotifywaitไม่ได้ยุติลงเองสคริปต์นี้จะไม่หยุด ดังนั้นแผนของฉันคือรับ PID ของกระบวนการ inotifywait บันทึกลงในไฟล์และมีกระบวนการอื่นฆ่ามันในภายหลังเช่น: inotifywait -m ... | { echo ??PID?? > pid-file; while ... } แต่ฉันไม่รู้วิธีรับ PID มีวิธีง่ายๆในการบรรลุเป้าหมายนี้หรือไม่? อีกวิธีหนึ่งก็คือการบันทึก PID ของเชลล์สคริปต์$$ไปยังไฟล์และฆ่าเชลล์สคริปต์ทั้งหมด แต่ฉันต้องการล้างข้อมูลบางอย่างหลังจากวนลูป ฉันลองใช้coprocแล้วฉันคิดว่ามันใช้งานได้ แต่ดูเหมือนว่าจะซับซ้อนกว่าที่จำเป็น
11 bash  pipe  pid 

3
นอนจนกว่าจะถึงเวลาต่อไปตามเวลาที่กำหนด
ฉันต้องการชุดคำสั่งหรือคำสั่งเดียวที่หลับจนกว่าจะเกิดเหตุการณ์ต่อไปของเวลาเฉพาะเช่น "4:00" ฉันจะทำอย่างไร atคำสั่งหรือ cronjob ไม่ได้เป็นตัวเลือกเพราะผมไม่ต้องออกจากสคริปต์ที่ผมในปัจจุบัน กรณีเฉพาะที่ฉันกำลังพูดถึงคือสคริปต์ทำงานในหน้าจอ มันสำคัญมากที่ฉันจะไม่หยุดการทำงานของสคริปต์ด้วยตัวเองเพราะมีตัวแปรสำคัญหลายอย่างที่จำเป็นในบางจุดของสคริปต์ สคริปต์ไม่ควรถูกเรียกใช้งานในเรื่องปกติเสมอไป มันเพียงแค่ต้องดำเนินการในเวลาที่กำหนด มันจะเป็นประโยชน์อย่างมากหากสคริปต์จะต้องสร้างไฟล์ใด ๆ หรืองานอื่น ๆ เช่น cronjobs หรือหน้าจออื่น ๆ นี่เป็นเพียงคำถามของการออกแบบ ฉันเพิ่งมีความคิดที่น่ากลัว: difference=$(($(date -d "4:00" +%s) - $(date +%s))) if [ $difference -lt 0 ] then sleep $((86400 + difference)) else sleep $difference fi คุณมีความคิดที่ดีกว่านี้ไหม? ข้อมูลเพิ่มเติมจะถูกเพิ่มหากมีการร้องขอ!
11 bash  date  time  sleep 

3
การมอบหมายแบบมีเงื่อนไขขึ้นอยู่กับตัวแปรสภาพแวดล้อม
ในสคริปต์ทุบตีฉันกำลังกำหนดตัวแปรโลคัลเพื่อให้ค่าขึ้นอยู่กับตัวแปรสภาพแวดล้อมโกลบอล ( $MYAPP_ENV) if [ "$MYAPP_ENV" == "PROD" ] then SERVER_LOGIN=foobar123@prod.example.com else SERVER_LOGIN=foobar987@test.example.com fi มีวิธีที่สั้นกว่า (ยังสะอาด) ในการเขียนการบ้านข้างต้นหรือไม่? (สมมุติว่าใช้ตัวดำเนินการตามเงื่อนไข / แบบอินไลน์บางอย่างถ้า)

3
รักษาสิทธิ์ของไฟล์ (หรือเรียกคืน) เมื่อทำการแทนที่ไฟล์
ฉันมีคำสั่งที่ยอมรับไฟล์เป็นอาร์กิวเมนต์ปรับเปลี่ยนไฟล์จากนั้นเขียนไปยังชื่อไฟล์ที่ระบุในอาร์กิวเมนต์ที่สอง ฉันจะเรียกโปรแกรมmodifyfileนั้น ฉันอยากให้มันทำงาน "แทนที่" ดังนั้นฉันจึงเขียนเชลล์สคริป (ทุบตี) ที่แก้ไขมันเป็นไฟล์ชั่วคราวจากนั้นย้ายมันกลับมา: TMP=`mktemp` modifyfile "$original" "$TMP" mv -v "$TMP" "$original" นี่เป็นผลข้างเคียงที่โชคร้ายของการทำลายการอนุญาตในไฟล์นี้ ไฟล์จะถูกสร้างขึ้นใหม่โดยมีการอนุญาตเริ่มต้น มีวิธีบอกให้mvคำสั่งเขียนทับปลายทางโดยไม่เปลี่ยนการอนุญาตหรือไม่? หรือจะมีวิธีบันทึกผู้ใช้กลุ่มและการอนุญาตจากต้นฉบับและกู้คืนได้หรือไม่

1
วิธีการอินพุต / เริ่มบรรทัดใหม่ในเทอร์มินัล bash
ฉันสังเกตเห็นตัวอย่าง bash สำหรับลูปถูกกระจายไปในหลายบรรทัดในตัวอย่าง for VARIABLE in file1 file2 file3 do command1 on $VARIABLE command2 commandN done (เช่นที่นี่ http://www.cyberciti.biz/faq/bash-for-loop/ ) ฉันจะป้อนบรรทัดใหม่ใน bash terminal ได้อย่างไร (ฉันใช้ putty) เมื่อฉันกด Enter ที่ส่วนท้ายของบรรทัดระบบจะเรียกใช้งานมัน
11 bash  line-editor 

5
วิธีการตรวจจับจากสคริปต์เมื่อโหลดเดสก์ท็อปของผู้ใช้
ฉันมีภูตที่ถูกนำไปใช้ในการทุบตีและทำงานโดยวิธีการcronและ@rebootตัวเลือกที่แสดงให้เห็นว่าเดสก์ท็อปไม่มีการใช้งาน สคริปต์มีดังต่อไปนี้ (กำหนดเวลาสั้น ๆ สำหรับการทดสอบ): #!/bin/bash P_STATE=0 while : do sleep 5 if [ $P_STATE == 0 ]; then [ `xprintidle` -ge 25000 ] && P_STATE=1 && wmctrl -k on else [ `xprintidle` -le 25000 ] && P_STATE=0 done ปัญหา: หากผู้ใช้ยังอยู่ในหน้าจอเข้าสู่ระบบxprintidleและwmctrlล้มเหลวเนื่องจากเดสก์ท็อปยังไม่โหลด เพื่อหลีกเลี่ยงสิ่งนี้ฉันได้ใส่บรรทัดถัดไปไว้ที่จุดเริ่มต้นของสคริปต์: while: do sleep 10s [ -n `who | …

3
bash: หลีกเลี่ยงแต่ละบรรทัดจากการสะท้อนที่ "-x"
ในทุบตีเมื่อทำงานกับ-xตัวเลือกมันเป็นไปได้ที่จะได้รับการยกเว้นคำสั่งของแต่ละบุคคลจากการสะท้อน? ฉันพยายามที่จะให้ออกเป็นระเบียบที่เป็นไปได้เพื่อให้ฉันทำงานบางส่วนของสคริปต์ของฉันใน subshell set +xกับ อย่างไรก็ตามแถวset +xนั้นยังคงสะท้อนอยู่และไม่เพิ่มข้อมูลที่มีค่าลงในเอาต์พุต ผมจำได้ว่ากลับมาอยู่ในที่ไม่ดีเก่า.batวันเมื่อทำงานกับสายของแต่ละบุคคลอาจจะได้รับการยกเว้นโดยเริ่มต้นพวกเขาด้วยecho on @มีผู้ใดเทียบเท่าในทุบตี? #!/bin/bash -x function i_know_what_this_does() { ( set +x echo do stuff ) } echo the next-next line still echoes 'set +x', is that avoidable? i_know_what_this_does echo and we are back and echoing is back on เมื่อเรียกใช้ข้างต้นผลลัพธ์คือ: + echo the next-next …
11 bash  shell  debugging 

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