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

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

3
ฟังเพื่อออกจากกระบวนการรับ pid $$
บอกว่าฉันมี pid อยู่ในมือ mypid=$$ มีคำสั่ง bash / system บ้างที่ฉันสามารถใช้ฟังเพื่อออกจากกระบวนการนั้นด้วย pid ที่กำหนด? หากไม่มีกระบวนการที่มี mypid อยู่ฉันเดาว่าคำสั่งควรล้มเหลว

7
มีวิธีป้องกันไม่ให้ sed ตีความหมายของสตริงการแทนที่หรือไม่? [ปิด]
ปิด คำถามนี้จะต้องมีมากขึ้นมุ่งเน้น ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้มุ่งเน้นที่ปัญหาเดียวโดยแก้ไขโพสต์นี้ ปิดให้บริการใน4 ปีที่แล้ว หากคุณต้องการแทนที่คำหลักด้วยสตริงที่ใช้ sed, sed พยายามอย่างหนักเพื่อตีความสตริงการแทนที่ของคุณ หากสตริงการแทนที่มีอักขระที่พิจารณาว่าพิเศษเช่นอักขระ '/' สตริงนั้นจะล้มเหลวเว้นแต่แน่นอนว่าคุณหมายถึงสตริงการแทนที่ของคุณที่จะมีอักขระที่บอกให้รู้ว่าจะต้องทำอย่างไร Ex: VAR="hi/" sed "s/KEYWORD/$VAR/g" somefile มีวิธีใดที่จะบอกว่าอย่าพยายามตีความสตริงการแทนที่สำหรับอักขระพิเศษ? สิ่งที่ฉันต้องการคือสามารถแทนที่คำหลักในไฟล์ด้วยเนื้อหาของตัวแปรไม่ว่าเนื้อหานั้นจะเป็นอะไร
16 bash  shell-script  sed 

6
สะท้อนด้วยความงงงวย
ฉันต้องการพิมพ์ตัวแปรบางอย่างไปที่หน้าจอ แต่ฉันต้องทำให้ยุ่งเหยิงกับตัวละครสองสามตัวแรกก่อนและฉันสงสัยว่ามีคำสั่ง echo ในการทุบตีที่สามารถทำให้ตัวอักษรตัวแรกของค่าลับในขณะพิมพ์ไปยังเทอร์มินัล: echo 'secretvalue' ********lue
15 bash  security 

6
การใช้ / bin / sh ใน hashbang นั้นถูกต้องหรือไม่หากเชลล์เป้าหมายไม่สามารถใช้งานได้
#!/bin/shโดยทั่วไปเชลล์สคริปต์มีความคิดเห็นต่อไปนี้ที่บรรทัดแรกของไฟล์สคริปต์: จากการวิจัยที่ฉันทำมันเรียกว่า "hash bang" และมันเป็นความเห็นทั่วไป /binความคิดเห็นนี้แจ้งยูนิกซ์ว่าไฟล์นี้จะถูกดำเนินการโดยบอร์นเชลล์ภายใต้ไดเรกทอรี คำถามของฉันเริ่มต้นในจุดนั้น #!/bin/bashถึงตอนนี้ฉันไม่ได้เห็นความคิดเห็นนี้เช่น #!/bin/shมันก็มักจะ อย่างไรก็ตามการแจกแจง Ubuntu ไม่มีโปรแกรม Bourne Shell พวกเขามี Bourne Again Shell (ทุบตี) ในจุดนั้นถูกต้องหรือไม่ที่จะแสดงความคิดเห็น#!/bin/shในเชลล์สคริปต์ที่เขียนในการแจกแจงของ Ubuntu?

4
การใช้นามแฝงการวางระเบิดในระดับโลกจะป้องกันไม่ให้มีการดำเนินการหรือไม่
ถ้าคุณจะตั้งทั่วโลก alias ':(){ :|:& };:'='echo fork bomb averted' นั่นจะเป็นกลยุทธ์ด้านความปลอดภัยที่มีประสิทธิภาพเพื่อหลีกเลี่ยงการประหารชีวิต Bash fork หรือจะมีวิธีในการดำเนินการหรือไม่? ฉันคิดว่าคำถามเป็นเงินสดออกไป: มีวิธีดำเนินการคำสั่งเมื่อมันเป็นนามแฝงกับสิ่งอื่นหรือไม่?
15 bash  security  alias 

7
ฉันจะตรวจสอบว่าไฟล์สามารถสร้างหรือตัดทอน / เขียนทับในทุบตีได้อย่างไร?
ผู้ใช้เรียกสคริปต์ของฉันกับเส้นทางของไฟล์ที่จะได้รับการอย่างใดอย่างหนึ่งจะสร้างหรือเขียนทับในบางจุดในสคริปต์เหมือนหรือfoo.sh file.txtfoo.sh dir/file.txt พฤติกรรมการสร้างหรือเขียนทับเป็นเหมือนข้อกำหนดสำหรับการวางไฟล์ทางด้านขวาของ>โอเปอเรเตอร์เอาท์พุทหรือส่งต่อเป็นอาร์กิวเมนต์ไปที่tee(อันที่จริงการส่งเป็นอาร์กิวเมนต์เพื่อteeเป็นสิ่งที่ฉันกำลังทำอยู่ ) ก่อนที่ฉันจะเข้าไปในความกล้าของสคริปต์ฉันต้องการตรวจสอบอย่างสมเหตุสมผลว่าไฟล์สามารถสร้าง / เขียนทับได้ แต่ไม่ได้สร้างจริง การตรวจสอบนี้ไม่จำเป็นต้องสมบูรณ์แบบและใช่ฉันรู้ว่าสถานการณ์สามารถเปลี่ยนแปลงได้ระหว่างการตรวจสอบและจุดที่ไฟล์ถูกเขียนจริง - แต่ที่นี่ฉันโอเคด้วยวิธีแก้ไขปัญหาความพยายามที่ดีที่สุดเพื่อให้ฉันสามารถประกันตัวได้เร็ว ในกรณีที่เส้นทางของไฟล์ไม่ถูกต้อง ตัวอย่างของสาเหตุที่ไฟล์ไม่สามารถสร้างได้: ไฟล์มีองค์ประกอบไดเรกทอรีเช่นdir/file.txtแต่dirไม่มีไดเรกทอรี ผู้ใช้ไม่มีสิทธิ์ในการเขียนในไดเรกทอรีที่ระบุ (หรือ CWD หากไม่มีการระบุไดเรกทอรี ใช่ฉันรู้ว่าการตรวจสอบการอนุญาต "ล่วงหน้า" ไม่ใช่The UNIX Way ™แต่ฉันควรลองใช้งานและขอการให้อภัยในภายหลัง ในสคริปต์เฉพาะของฉันสิ่งนี้นำไปสู่ประสบการณ์การใช้งานที่ไม่ดีและฉันไม่สามารถเปลี่ยนองค์ประกอบที่รับผิดชอบได้

2
เครื่องหมายคำพูดคู่ในทุบตีจับคู่กันอย่างไร
GNU bash 4.3.48ฉันใช้ พิจารณาสองคำสั่งต่อไปนี้ที่แตกต่างกันโดยเครื่องหมายดอลลาร์เดียวเท่านั้น คำสั่ง 1: echo "(echo " * ")" คำสั่ง 2: echo "$(echo " * ")" ผลลัพธ์ของพวกเขาคือตามลำดับ (echo test.txt ppcg.sh ) และ * เห็นได้ชัดในกรณีแรก*คือก้อนกลมซึ่งหมายความว่าเครื่องหมายอัญประกาศแรกไปพร้อมกับที่สองในการสร้างคู่และที่สามและสี่ในรูปแบบคู่อื่น ในกรณีที่สอง*ไม่ได้ถูกทำให้กลมและมีช่องว่างพิเศษสองช่องในช่องสัญญาณออกหนึ่งช่องก่อนหน้าเครื่องหมายดอกจันและช่องว่างด้านหลังหมายความว่าเครื่องหมายคำพูดที่สองจะขึ้นกับช่องที่สามและช่องแรกจะไปกับช่องที่สี่ มีกรณีอื่นนอกเหนือจากการ$()ก่อสร้างที่มีเครื่องหมายอัญประกาศไม่ตรงกับอันถัดไป แต่ซ้อนกันแทน? พฤติกรรมนี้ได้รับการบันทึกไว้อย่างดีหรือไม่และถ้าใช่ฉันจะหาเอกสารที่เกี่ยวข้องได้จากที่ใด

8
วิธีการทดสอบว่าองค์ประกอบอาร์เรย์มีความเท่าเทียมกันในการทุบตี?
อาร์เรย์ต่อไปนี้แสดงจำนวนดิสก์ในเครื่อง linux แต่ละเครื่อง แต่ละอาร์เรย์เดียวรวมถึงจำนวนของดิสก์ในที่เครื่องลินุกซ์ echo ${ARRAY_DISK_Quantity[*]} 4 4 4 4 2 4 4 4 วิธีง่ายๆในการระบุว่าทุกค่าของอาร์เรย์มีค่าเท่ากัน? สถานะที่ดี: 4 4 4 4 4 4 4 4 สถานะไม่ดี: 4 4 4 4 4 4 2 4 สถานะไม่ดี: 6 6 6 6 6 6 6 6 6 6 2 6 2
15 bash  shell-script  awk  array 

3
bash รองรับการอ้างอิงกลับในการขยายพารามิเตอร์หรือไม่
ฉันมีชื่อตัวแปรdescrซึ่งสามารถมีสตริงBlah: -> r1-ae0-2 / [123], -> s7-Gi0-0-1:1-US / Fooฯลฯ ฉันต้องการที่จะได้รับ-> r1-ae0-2, -> s7-Gi0-0-1:1-USส่วนหนึ่งมาจากสตริง ในขณะนี้ฉันใช้descr=$(grep -oP '\->\s*\S+' <<< "$descr"สำหรับสิ่งนี้ มีวิธีที่ดีกว่าในการทำเช่นนี้? เป็นไปได้ไหมที่จะทำเช่นนี้กับการขยายพารามิเตอร์

5
วิธีการตรวจสอบบรรทัดของสคริปต์ทุบตีจะถูกดำเนินการ
มีวิธีการตรวจสอบหมายเลขบรรทัดของbashสคริปต์ที่จะถูกดำเนินการ "ตอนนี้"? การใช้bash -x script.shรูปลักษณ์ที่ดูดี อย่างไรก็ตามฉันต้องได้รับหมายเลขบรรทัดปัจจุบัน

5
เป็นโปรแกรม "ถ้า" และ "แล้ว" ที่จริงแล้ว
ฉันอ่านว่าใช้เครื่องหมายอัฒภาคเพื่อคั่นโปรแกรม: $ echo 3; ls -la มันหมายความว่าอย่างนั้นifหรือthenและelseเป็นโปรแกรมแยกต่างหากที่นี่ $ if [ $VARIABLE == abcdef ] ; then echo yes ; else echo no ; fi คำถามนี้ไม่เกี่ยวกับเครื่องหมายอัฒภาค

1
เปลือกทั่วไป“ ส้อมระเบิด” เรียกตัวเองว่าสองครั้งอย่างแน่นอนอย่างไร?
หลังจากผ่านคำถาม Fork Bombที่โด่งดังใน Askubuntu และเว็บไซต์แลกเปลี่ยนเงินตราต่างประเทศอื่น ๆ ฉันไม่เข้าใจว่าสิ่งที่ทุกคนพูดถึงมันชัดเจน คำตอบมากมาย ( ตัวอย่างที่ดีที่สุด ) พูดอย่างนี้: " {:|: &}หมายถึงเรียกใช้ฟังก์ชัน:และส่งออกไปยัง:ฟังก์ชันอีกครั้ง" ดีสิ่งที่แน่นอนคือการส่งออกของ:? สิ่งที่ถูกส่งผ่านไปยังอีก:หรือไม่ และนอกจากนี้ยังมี: โดยพื้นฐานแล้วคุณกำลังสร้างฟังก์ชั่นที่เรียกตัวเองว่าสองครั้งทุกการโทรและไม่มีทางที่จะยุติตัวเอง วิธีการที่ถูกดำเนินการสองครั้งว่า? ในความคิดของฉันไม่มีอะไรถูกส่งผ่านไปยังวินาที:จนกว่าการดำเนินการครั้งแรกจะ:เสร็จสิ้นซึ่งจริงๆแล้วจะไม่มีวันสิ้นสุด ในCตัวอย่างเช่น foo() { foo(); foo(); // never executed } ที่สองfoo()ไม่ได้ดำเนินการเลยเพียงเพราะครั้งแรกfoo()ไม่สิ้นสุด ฉันคิดว่าตรรกะเดียวกันนี้ใช้ได้กับ:(){ :|: & };:และ :(){ : & };: ทำงานเช่นเดียวกับ :(){ :|: & };: โปรดช่วยฉันเข้าใจตรรกะ

3
วิธีรันหนึ่งคำสั่งที่มีไดเรกทอรีเป็นอาร์กิวเมนต์แล้ว cd ไปเหมือนกัน? ฉันได้รับ“ ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว”
ฉันต้องการสร้างฟังก์ชั่นสั้น ๆ เพื่อทำสิ่งต่อไปนี้ สมมติว่าฉันย้ายไฟล์ 'file.tex' ไปยังไดเรกทอรีเอกสารของฉัน: mv file.tex ~/Documents จากนั้นฉันต้องการไปcdยังไดเรกทอรีนั้น: cd ~/Documents ฉันต้องการที่จะพูดคุยนี้ไปยังไดเรกทอรีใด ๆ เพื่อให้ฉันสามารถทำได้: mv file.tex ~/Documents follow และให้followคำสั่งอ่านปลายทางจากคำสั่งก่อนหน้าจากนั้นดำเนินการตามนั้น สำหรับไดเรกทอรีง่าย ๆ มันไม่ได้ประหยัดเวลามาก แต่เมื่อทำงานกับไดเรกทอรีที่ซ้อนกันมันจะยิ่งใหญ่มากที่จะสามารถใช้ mv file.tex ~/Documents/folder1/subfolder1 follow ฉันคิดว่ามันค่อนข้างง่ายและฉันสามารถทำสิ่งนี้: follow() { place=`history 2 | sed -n '1p;1q' | rev | cut -d ' ' -f1 | rev` cd $place } …
15 bash  cd-command 

2
โปรแกรมส่งออกไปยังที่อื่นนอกเหนือจาก STDOUT / STDERR อย่างไร จะหลีกเลี่ยงได้อย่างไร
เห็นได้ชัดว่าฉันไม่ทราบปลายทางปลายทางทั้งหมดที่พร้อมใช้งาน ฉันรู้เกี่ยวกับstdout( &1) และstderr( &2) อย่างไรก็ตามหลังจากเปลี่ยนเส้นทางทั้งสองอธิบายบางครั้งฉันยังคงได้รับผลลัพธ์บางอย่างในคอนโซลของฉัน! ตัวอย่างที่ง่ายที่สุดที่ฉันนึกได้ก็คือ GNU Parallel ทุกครั้งที่ฉันใช้มันฉันเห็นประกาศการอ้างอิง แม้เมื่อฉันทำ&2>1 > fileฉันก็ยังเห็นประกาศ และเช่นเดียวกับemerge: เมื่อฉันวิ่งออกมาและมีปัญหาบางอย่างข้อมูลบางอย่างจะไม่ถูกพิมพ์ออกไปstdoutหรือstdinเนื่องจากฉันเปลี่ยนเส้นทางพวกเขาและพวกเขายังคงผ่าน ฉันใช้วิธีแก้ปัญหาเหล่านี้เป็นส่วนใหญ่scriptแต่ฉันก็ยังสงสัยว่าอะไรทำให้เกิดปัญหานี้

1
exec และทีออฟล็อกไฟล์: อธิบายคำสั่ง bash เหล่านี้
ฉันเห็นสิ่งนี้ที่ด้านบนของไฟล์สคริปต์ทุบตี: export LOGFILE=$LOGDIRECTORY/${SCRIPT_NAME}.log exec > >(tee $LOGFILE) exec 2>&1 มันทำอะไร? กระบวนการ exec สองกระบวนการทำที่นี่ ฉันรู้ว่าการทำให้เป็นแบบนี้ผลลัพธ์ทั้งหมดของการดำเนินการของสคริปต์จะถูกไพพ์ไป$LOGFILEแต่ฉันต้องการที่จะเข้าใจจากมุมมองของexecข้อความ
15 bash 

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