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

2
Bash เน้นไวยากรณ์ของ subshells
เมื่อพิจารณาถึงคำถามจำนวนมากที่เกี่ยวข้องกับ subshells ใน Bash ("ทำไมตัวแปรของฉันไม่เพิ่มในpiped while readloopนี้") ฉันแค่คิดว่ามันดีมากที่จะอ้างถึงตัวแก้ไขหรือบริการที่โค้ด ซึ่งจะถูกดำเนินการใน subshells ถูกจัดรูปแบบแตกต่างจากรหัสดำเนินการในเปลือกแม่ มันอาจจะมีประโยชน์ในฐานะอุปกรณ์การศึกษา (ดูความแตกต่างระหว่างcode | codeและcode < <(code)ทันที) สิ่งนี้มีอยู่ไหม? คะแนนโบนัสหากใครใช้สำหรับ jEdit หรือ VIm เห็นได้ชัดว่าไม่จำเป็นต้องสมบูรณ์แบบ (ไม่มีการเน้นไวยากรณ์ในประสบการณ์ของฉัน) แต่ฉันสงสัยว่าสิ่งต่าง ๆ เช่นนี้(foo=bar; echo $foo;)และcommand | while read ...ไม่ควรยากเกินไปสำหรับการเริ่มต้น

2
sub-shell เป็นสิ่งเดียวกันกับ child-shell
: มีสองชื่อsubshellและเด็กเปลือก ใช่กระบวนการลูกจะเริ่มจากสิ่งนี้: sh -c 'echo "Hello"' ( echo "hello" ) echo "$(echo "hello") echo "hello" | cat ทุกคนมีความเสมอภาคและใช้ชื่อเดียวกันหรือไม่? ทุกคนแบ่งปันคุณสมบัติเดียวกันหรือไม่ POSIX มีคำจำกัดความนี้ : สภาวะแวดล้อมการประมวลผลเชลล์ประกอบด้วย .... แต่ลิงค์สุดท้ายของย่อหน้าด้านบนมี: สภาพแวดล้อม subshell จะต้องสร้างขึ้นซ้ำกับสภาพแวดล้อมของเชลล์ยกเว้นกับดักสัญญาณที่ไม่ได้ถูกละเว้นจะถูกตั้งค่าเป็นการกระทำเริ่มต้น และพิเศษ: การทดแทนคำสั่งคำสั่งที่จัดกลุ่มด้วยวงเล็บและรายการแบบอะซิงโครนัสจะต้องถูกดำเนินการในสภาพแวดล้อมย่อย นอกจากนี้แต่ละคำสั่งของไปป์ไลน์แบบหลายคำสั่งอยู่ในสภาพแวดล้อม subshell .... sh -c 'echo "Hello"'ไม่ได้รวมอยู่ที่นั่นควรที่จะเรียกว่า subshell ยัง?

2
ขยายเชลล์ย่อยก่อนเรียกใช้งานหรือไม่
ฉันมักเรียกใช้คำสั่งโดยใช้ subshells และบางครั้งต้องการที่จะขยาย subshells ก่อนที่ฉันจะทำงานบางอย่าง .. วิธีนี้ฉันสามารถตรวจสอบสิ่งที่ฉันทำและอาจแก้ไขสิ่งที่เกิดขึ้นเช่นกัน ตัวอย่างเช่นฉันจะขยายบรรทัดคำสั่งต่อไปนี้ก่อนที่จะเรียกใช้เพื่อให้ฉันสามารถแก้ไขผลลัพธ์ของ subshell ได้อย่างไร เช่น $ find -name "test.txt" /tmp/test.txt $ mv $(!!) /tmp/new.txt ฉันต้องการเห็น subshell ขยายก่อนที่ฉันเรียกใช้คำสั่งเช่น: $ mv /tmp/test.txt /tmp/new.txt มีวิธีการทำเช่นนี้?

2
วิธีทำให้ตัวแปรจากเชลล์ย่อยพร้อมใช้งานในพาเรนต์เชลล์
ฉันได้เขียนสคริปต์ที่รวดเร็วและสกปรกเพื่อรายงานเวลาจากบริการเว็บ: BASE_URL='http://example.com/json/webservice/' FIRST=1 FINAL=10000 for report_code in $(seq 1 $FINAL); do (time -p response=$(curl --write-out %{http_code} --silent -O ${BASE_URL}/${report_code}) ) 2> ${report_code}.time echo $response # <------- this is out of scope! How do I fix that? if [[ $response = '404' ]]; then echo "Deleting report # ${report_code}!" rm ${report_code} …

2
ทำไมกลุ่มคำสั่ง brace ต้องการช่องว่างหลังจากเปิดวงเล็บปีกกาใน POSIX Shell Grammar
TL; DR : ทำไมช่องว่างกลุ่ม POSIX รั้งจำเป็นหลังจาก{คำสงวน แต่ subshell ไม่หลังจากคำสงวน(? ไวยากรณ์ของ POSIX เชลล์กำหนดกลุ่มวงเล็บปีกกาและ subshell ดังนี้ brace_group : Lbrace compound_list Rbrace subshell : '(' compound_list ')' ทีนี้ถ้าเราอ่านว่าช่องว่างนั้นสำคัญมาก นี่หมายความว่าจะต้องมีพื้นที่ที่แยกเปิดและปิดวงเล็บปีกกาและวงเล็บเช่นเดียวกับใน { echo hello world; } ( echo hello world ) สิ่งนี้จะสอดคล้องกับคำสั่งคำสั่งผสม : คำสั่งผสมเหล่านี้แต่ละคำมีคำที่สงวนไว้หรือผู้ดำเนินการควบคุมในตอนเริ่มต้นและคำที่สงวนไว้สำหรับคำสั่งสุดท้ายหรือคำว่าผู้ประกอบการที่เกี่ยวข้องในตอนท้าย อย่างไรก็ตามสิ่งที่ไม่สมเหตุสมผลคือเหตุผล(list)และ( list )ทำงานได้ดี ( (ไม่จำเป็นต้องใช้พื้นที่นั้นหลังจากนั้น) อย่างไรก็ตามการขยายตัวของรั้งต้องมีพื้นที่ชั้นนำเช่น{echo hello;}ไม่ทำงาน แน่นอนว่าคำที่สงวนไว้ซึ่งได้รับการปฏิบัติเหมือนคำว่าเชลล์จำเป็นต้องเว้นวรรคเพื่อให้สอดคล้องกับแนวคิดของการแยกฟิลด์อย่างไรก็ตามคำจำกัดความของตัวเองไม่ได้พูดถึงช่องว่าง นอกจากนี้หาก{และ(ทั้งคู่ถือว่าคำที่สงวนไว้โดยนิยาม POSIX ของคำสั่งผสมทำไมพวกเขาถึงได้รับการปฏิบัติที่แตกต่างกันเกี่ยวกับอักขระช่องว่างหลังจากคำที่สงวนไว้เหล่านี้? …
10 shell  posix  subshell  syntax 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.