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

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

1
เหตุใด bash fork bombs จึงทำงานต่างกันและความสำคัญของมันคืออะไร?
ฉันรู้ว่า Fork fork แบบธรรมดาทำงานได้อย่างไร แต่ฉันไม่เข้าใจว่าทำไม & ในตอนท้ายของการวางระเบิด bash fork ทั่วไปและทำไมสคริปต์เหล่านี้จึงมีความแตกต่าง: :(){ (:) | (:) }; : และ :(){ : | :& }; : อดีตทำให้การใช้งาน cpu ขัดขวางก่อนที่จะทิ้งฉันกลับไปที่หน้าจอเข้าสู่ระบบ หลังทำให้ระบบของฉันค้างแข็งแทนที่จะบังคับให้ฉันรีบูตยาก ทำไมถึงเป็นอย่างนั้น? ทั้งสองอย่างต่อเนื่องสร้างกระบวนการใหม่ดังนั้นทำไมระบบทำงานแตกต่างกันอย่างไร สคริปต์ทั้งสองยังทำงานแตกต่างจาก :(){ : | : }; : ซึ่งไม่ได้ทำให้เกิดปัญหาใด ๆ เลยถึงแม้ว่าฉันจะคาดหวังให้พวกเขาเหมือนกัน หน้าคู่มือทุบตีระบุว่าคำสั่งในไปป์ไลน์ถูกดำเนินการแล้วใน subshell ดังนั้นฉันจึงเชื่อว่า: | : ควรเพียงพอแล้ว ฉันเชื่อ & ควรเรียกใช้ไปป์ไลน์ใน subshell ใหม่ …

7
กระชับ bash พรอมต์เมื่อใช้ต้นไม้ไดเรกทอรี / ชื่อไฟล์
ในระบบที่มี Ubuntu 14.04 และbashฉันมีPS1ตัวแปรลงท้ายด้วยเนื้อหาดังต่อไปนี้: \u@\h:\w\$ เพื่อให้พรอมต์ปรากฏเป็น user@machinename:/home/mydirectory$ อย่างไรก็ตามบางครั้งไดเรกทอรีปัจจุบันมีชื่อยาวหรืออยู่ภายในไดเรกทอรีที่มีชื่อยาวเพื่อให้พรอมต์ดูเหมือน user@machinename:/home/mydirectory1/second_directory_with_a_too_long_name/my_actual_directory_with_another_long_name$ วิธีนี้จะเติมบรรทัดในเทอร์มินัลและเคอร์เซอร์จะไปยังอีกบรรทัดหนึ่งซึ่งน่ารำคาญ ฉันต้องการที่จะได้รับบางสิ่งบางอย่างแทน user@machinename:/home/mydirectory1/...another_long_name$ มีวิธีการกำหนดPS1ตัวแปรเพื่อ "ห่อ" และ "กระชับ" ชื่อไดเรกทอรีเพื่อไม่เกินจำนวนอักขระที่กำหนดรับพรอมต์ที่สั้นลงหรือไม่

2
ทำไมการใช้ 'ใช่' บนท่อทุบตี * ไม่ * ทำให้เกิดลูปไม่สิ้นสุด?
ตามเอกสารของมันทุบตีรอจนกว่าคำสั่งทั้งหมดในไปป์ไลน์ได้เสร็จสิ้นการทำงานก่อนที่จะดำเนินการต่อไป เชลล์รอคำสั่งทั้งหมดในไปป์ไลน์เพื่อยกเลิกก่อนที่จะส่งคืนค่า เหตุใดคำสั่งจึงyes | trueเสร็จสิ้นในทันที ไม่ควรyesวนซ้ำตลอดไปและทำให้ท่อไม่เคยกลับมาใช่ไหม และคำถามย่อย: ตามข้อมูลจำเพาะของ POSIXท่อส่งเชลล์อาจเลือกที่จะส่งคืนหลังจากคำสั่งสุดท้ายเสร็จสิ้นหรือรอจนกว่าคำสั่งทั้งหมดจะเสร็จสิ้น กระสุนทั่วไปมีพฤติกรรมแตกต่างกันในแง่นี้หรือไม่? มีกระสุนที่ไหนบ้างที่yes | trueจะวนซ้ำตลอดไป?
16 bash  shell  pipe 

2
“ </ dev / null” หมายถึงอะไร
ฉันเข้าใจการ&gt; /dev/nullเปลี่ยนเส้นทางสิ่ง/dev/nullที่ทำหน้าที่เหมือนหลุมดำ อย่างไรก็ตามฉันไม่เข้าใจความ&lt; /dev/nullหมาย ฉันเห็นสคริปต์ที่เขียนแบบนี้: nohup myprogram &gt; foo.out 2&gt; foo.err &lt; /dev/null &amp; ดังนั้น&lt; /dev/nullในรหัสข้างต้นหมายความว่าอย่างไร นี่คือตัวอย่างที่แนะนำ
16 bash 

5
นี่เป็นข้อบกพร่องในการทุบตีหรือไม่? `return 'ไม่ออกจากฟังก์ชั่นถ้าเรียกจากไพพ์
ฉันมีปัญหาแปลก ๆ กับทุบตีเมื่อเร็ว ๆ นี้ ในขณะที่พยายามทำให้สคริปต์ของฉันง่ายขึ้นฉันได้รับโค้ดเล็ก ๆ นี้: $ o(){ echo | while read -r; do return 0; done; echo $?;}; o 0 $ o(){ echo | while read -r; do return 1; done; echo $?;}; o 1 returnควรออกจากฟังก์ชั่นโดยไม่พิมพ์$?ใช่มั้ย ถ้าอย่างนั้นฉันจะตรวจสอบว่าฉันสามารถกลับจากท่อเพียงอย่างเดียว: $ echo | while read -r; do return 1; done …

2
การใช้ทรัพยากรโดยใช้ไพพ์และนี่สตริง
เราสามารถได้รับผลเดียวกันโดยใช้ทั้งสองต่อไปนี้ในbash, echo 'foo' | cat และ cat &lt;&lt;&lt; 'foo' คำถามของฉันคืออะไรความแตกต่างระหว่างสองสิ่งนี้เท่าที่ใช้ทรัพยากรเกี่ยวข้องและสิ่งที่ดีกว่า ความคิดของฉันคือว่าในขณะที่ใช้ท่อเราจะใช้กระบวนการพิเศษและท่อขณะที่อยู่ในที่นี่สตริงเพียงอธิบายไฟล์จะถูกนำมาใช้กับechocat
16 bash  pipe  resources 

3
วิธีเรียก“ sub” .putput (เช่นเดียวกับใน. bashrc ซึ่งคุณสามารถ“ source sub_script.sh”)
ฉัน~/.bashrcมีหนึ่งบรรทัด: source my_config/my_actual_bashrc.sh มีการเทียบเท่ากับ.inputrcดังนั้นการปรับแต่งของฉันสามารถอยู่ในสถานที่ที่แยกต่างหากและ "เรียกว่า" โดย~/.inputrc?
16 bash  bashrc  inputrc 

6
Shell:“ แสดงความเป็นไปได้ทั้งหมด 2588?”
ดังนั้นฉันจึงย้ายแล็ปท็อปของฉันไปรอบ ๆ (และฉันมีนิสัยที่ไม่ดีในการจัดวางสิ่งต่าง ๆ บนแป้นพิมพ์ ... ) และฉันตื่นขึ้นมาเพื่อค้นหาสิ่งนี้: $ แสดงความเป็นไปได้ทั้งหมด 2588 รายการ? (y หรือ n) คำสั่งอะไรที่จะแสดงบางอย่างเช่นนี้? ฉันกำลังใช้ Bash
16 bash  shell 

2
การใช้งานจริงของตัวเลือก `set -k` ใน bash
เมื่อไหร่ที่เราจะใช้set -kตัวเลือกในการทุบตี? คู่มืออ้างอิง Bashกล่าวว่า อาร์กิวเมนต์ทั้งหมดในรูปแบบของคำสั่งการมอบหมายจะถูกวางไว้ในสภาพแวดล้อมสำหรับคำสั่งไม่ใช่เฉพาะที่นำหน้าชื่อคำสั่ง ฉันเข้าใจว่าตัวเลือกทำอะไร แต่ไม่สามารถจินตนาการได้เมื่อเราต้องการ
16 bash  shell 

1
การทุบตีเสร็จสมบูรณ์สำหรับค่าที่คั่นด้วยเครื่องหมายจุลภาค
ฉันต้องการสร้างกฎความสมบูรณ์สำหรับรายการพารามิเตอร์ที่คั่นด้วยเครื่องหมายจุลภาค เช่นฉันมีคำสั่งที่ได้รับรายชื่อเซิร์ฟเวอร์: myscript -s name1,name2,name3 ในขณะนี้ฉันได้จัดการเขียนเสร็จสมบูรณ์ดังต่อไปนี้: _myscript () { local cur prev opts _get_comp_words_by_ref cur prev opts='-s' servers='name1 name2 name3' if [[ ${cur} == -* ]] ; then COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) ) else case "${prev}" in -s) if [[ "$cur" == *,* ]]; then local realcur prefix …

5
ฟังก์ชันทุบตี stateful
ฉันต้องการใช้ฟังก์ชั่นใน Bash ซึ่งจะเพิ่มจำนวน (และคืน) จำนวนการโทรทุกครั้ง น่าเสียดายที่นี่ดูไม่สำคัญเพราะฉันเรียกใช้ฟังก์ชั่นภายใน subshell และดังนั้นจึงไม่สามารถแก้ไขตัวแปรของ parent shell ได้ นี่คือความพยายามของฉัน: PS_COUNT=0 ps_count_inc() { let PS_COUNT=PS_COUNT+1 echo $PS_COUNT } ps_count_reset() { let PS_COUNT=0 } นี้จะใช้ดังนี้ (และด้วยเหตุนี้ฉันต้องเรียกใช้ฟังก์ชันจาก subshell): PS1='$(ps_count_reset)&gt; ' PS2='$(ps_count_inc) ' ด้วยวิธีนี้ฉันจะได้รับพรอมต์หลายบรรทัดที่มีหมายเลข: &gt; echo 'this 1 is 2 a 3 test' น่ารัก แต่เนื่องจากข้อ จำกัด ดังกล่าวไม่ทำงาน โซลูชันที่ไม่ทำงานจะเขียนจำนวนลงในไฟล์แทนตัวแปร อย่างไรก็ตามสิ่งนี้จะสร้างความขัดแย้งระหว่างเซสชันหลายเซสชันพร้อมกัน ฉันสามารถต่อท้าย ID …

4
แปลงทุก pdf ในไดเรกทอรีปัจจุบันเป็น png
ฉันต้องการเขียนbashสคริปต์เพื่อแปลง.pdfไฟล์ทุกไฟล์ในไดเรกทอรีปัจจุบันเป็น.pngไฟล์ ตัวอย่างเช่น: $ls . a.pdf b.pdf $./pdf2png.sh Converting pdfs to pngs a.pdf -&gt; a.png b.pdf -&gt; b.png นี่คือความพยายามที่ดีที่สุดของฉัน: #!/bin/bash convert -verbose -density 500 -resize '800' a.pdf a.png convert -verbose -density 500 -resize '800' b.pdf b.png
16 bash  imagemagick 

4
ฉันจะเปลี่ยนเป็นโหมดแก้ไข vi ใน readline ได้อย่างไร
ฉันต้องการเปลี่ยนเป็นโหมดแก้ไข vi ในระบบ readline แต่ฉันไม่ต้องการใช้ 'set -o vi' ฉันต้องการสลับโดยใช้แป้นพิมพ์ลัดชั่วคราว M-C-jหน้าคนพูดว่าฉันสามารถทำเช่นนี้กับ แต่นั่นไม่ได้ผลสำหรับฉัน ฉันใช้ Ubuntu และ xterm ไม่สามารถทำงานภายใต้ gnome-terminal ได้เช่นกัน
16 bash  readline 

5
การใช้รายการชื่อไฟล์ที่สร้างขึ้นเป็นรายการอาร์กิวเมนต์ - พร้อมช่องว่าง
findฉันพยายามที่จะเรียกใช้สคริปต์กับรายการของชื่อไฟล์ที่เก็บรวบรวมโดย ไม่มีอะไรพิเศษเพียง someting เช่นนี้: $ myscript `find . -name something.txt` ปัญหาคือชื่อพา ธ บางส่วนมีช่องว่างดังนั้นพวกเขาจึงแยกออกเป็นชื่อที่ไม่ถูกต้องสองชื่อในการขยายอาร์กิวเมนต์ ปกติฉันจะล้อมรอบชื่อด้วยเครื่องหมายคำพูด แต่ที่นี่พวกเขาแทรกโดยการขยาย backquote ฉันพยายามกรองเอาท์พุทของfindและรอบ ๆ ชื่อไฟล์แต่ละรายการด้วยเครื่องหมายคำพูด แต่เมื่อถึงเวลาที่เห็นพวกเขามันสายเกินไปที่จะดึงออกมาและพวกเขาจะถือว่าเป็นส่วนหนึ่งของชื่อไฟล์: $ myscript `find . -name something.txt | sed 's/.*/"&amp;"/'` No such file or directory: '"./somedir/something.txt"' ใช่นั่นเป็นกฎสำหรับวิธีการประมวลผลบรรทัดคำสั่ง แต่ฉันจะแก้ไขได้อย่างไร นี่เป็นเรื่องที่น่าอาย แต่ฉันไม่สามารถหาวิธีที่เหมาะสมได้ ในที่สุดฉันก็รู้ว่าจะทำอย่างไรกับxargs -0 -n 10000... แต่มันเป็นแฮ็คที่น่าเกลียดที่ฉันยังต้องการถาม: ฉันจะอ้างถึงผลลัพธ์ของการขยาย backquote หรือบรรลุผลแบบเดียวกันได้อย่างไร? แก้ไข:ฉันสับสนเกี่ยวกับความจริงที่ว่าxargs ไม่เก็บขัดแย้งทั้งหมดเป็นรายการอาร์กิวเมนต์เดียวเว้นแต่จะบอกเป็นอย่างอื่นหรือข้อ จำกัด …

2
การเปลี่ยนเส้นทางกับ> | ทำ?
เมื่อใดที่คุณควรใช้&gt;|เพื่อเปลี่ยนเส้นทางเอาต์พุตไปยังไฟล์แทนที่จะเป็นเพียง&gt;? คำอธิบายที่ให้ไว้เมื่อฉันแสดงนี้คือมันรับประกันว่าไฟล์เป้าหมายจะถูกตัดทอนก่อน แต่ฉันคิดว่า&gt;โดยนัยแล้ว เป็น&gt;|ประโยชน์หรือไม่

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