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

2
วงเล็บใส่คำสั่งลงใน subshell หรือไม่?
จากสิ่งที่ฉันได้อ่านการวางคำสั่งในวงเล็บควรเรียกใช้ใน subshell คล้ายกับการเรียกใช้สคริปต์ ถ้าเป็นจริงมันจะเห็นตัวแปร x ถ้า x ไม่ถูกส่งออกได้อย่างไร x=1 การรัน(echo $x)บนบรรทัดคำสั่งจะส่งผลให้ 1 การรันecho $xสคริปต์จะไม่ส่งผลอะไรตามที่คาดไว้

3
$ () subshell หรือไม่
ฉันเข้าใจไวยากรณ์ของ subshell (<commands...>)เป็น$()เพียง subshell ที่คุณสามารถดึงค่าตัวแปรได้หรือไม่ หมายเหตุ: สิ่งนี้ใช้กับทุบตี 4.4 ตามถ้อยคำต่าง ๆ ในเอกสารประกอบ
51 bash  subshell  syntax 

4
ทำไม (ทางออก 1) ไม่ออกจากสคริปต์
ฉันมีสคริปต์ที่ไม่ได้ออกเมื่อฉันต้องการมัน ตัวอย่างสคริปต์ที่มีข้อผิดพลาดเดียวกันคือ: #!/bin/bash function bla() { return 1 } bla || ( echo '1' ; exit 1 ) echo '2' ฉันคิดว่าจะเห็นผลลัพธ์: :~$ ./test.sh 1 :~$ แต่ฉันเห็นจริง: :~$ ./test.sh 1 2 :~$ ที่ไม่()สั่งการผูกมัดใดสร้างขอบเขตหรือไม่? เกิดอะไรขึ้นexitถ้าไม่ใช่สคริปต์?

3
สร้างเชลล์ย่อยด้วยเครื่องหมายปีกกา
ตามนี้ , วางรายการของคำสั่งระหว่างวงเล็บปีกกาทำให้เกิดรายการที่จะดำเนินการในบริบทเปลือกปัจจุบัน ไม่มี subshell จะถูกสร้างขึ้น ใช้psเพื่อดูสิ่งนี้ในการทำงาน นี่คือลำดับชั้นกระบวนการสำหรับไพพ์ไลน์กระบวนการดำเนินการโดยตรงบนบรรทัดคำสั่ง 4398 เป็น PID สำหรับเชลล์ล็อกอิน: sleep 2 | ps -H; PID TTY TIME CMD 4398 pts/23 00:00:00 bash 29696 pts/23 00:00:00 sleep 29697 pts/23 00:00:00 ps ตอนนี้ตามลำดับชั้นกระบวนการสำหรับไพพ์ไลน์กระบวนการระหว่างวงเล็บปีกกาที่ดำเนินการโดยตรงบนบรรทัดคำสั่ง 4398 เป็น PID สำหรับเชลล์ล็อกอิน มันคล้ายกับลำดับชั้นด้านบนเพื่อพิสูจน์ว่าทุกอย่างถูกดำเนินการในบริบทเชลล์ปัจจุบัน : { sleep 2 | ps -H; } PID TTY TIME …
31 bash  subshell 

6
ออกจากเชลล์สคริปต์จากเชลล์ย่อย
ลองพิจารณาตัวอย่างนี้: stop () { echo "${1}" 1>&2 exit 1 } func () { if false; then echo "foo" else stop "something went wrong" fi } โดยปกติเมื่อfuncถูกเรียกมันจะทำให้สคริปต์หยุดทำงานซึ่งเป็นพฤติกรรมที่ตั้งใจไว้ อย่างไรก็ตามถ้ามันถูกดำเนินการใน sub-shell เช่น in result=`func` มันจะไม่ออกจากสคริปต์ ซึ่งหมายความว่ารหัสการโทรต้องตรวจสอบสถานะการออกของฟังก์ชั่นทุกครั้ง มีวิธีหลีกเลี่ยงสิ่งนี้หรือไม่? สิ่งนี้set -eมีไว้เพื่ออะไร?

3
ฉันจะตรวจสอบได้อย่างไรว่าฉันอยู่ในชั้นย่อย
ฉันพยายามเขียนฟังก์ชั่นเพื่อแทนที่ฟังก์ชั่นการทำงานของexitbuiltin เพื่อป้องกันตัวเองไม่ให้ออกจากเครื่อง ฉันพยายามใช้SHLVLตัวแปรสภาพแวดล้อม แต่ดูเหมือนจะไม่เปลี่ยนแปลงภายใน subshells: $ echo $SHLVL 1 $ ( echo $SHLVL ) 1 $ bash -c 'echo $SHLVL' 2 ฟังก์ชั่นของฉันเป็นดังนี้: exit () { if [[ $SHLVL -eq 1 ]]; then printf '%s\n' "Nice try!" >&2 else command exit fi } สิ่งนี้จะไม่อนุญาตให้ฉันใช้exitภายใน subshells แม้ว่า: $ exit Nice try! $ …
24 bash  shell  exit  subshell 

3
กฎสำหรับเรียกใช้ subshell ใน Bash?
ฉันดูเหมือนจะเข้าใจผิดกฎของ Bash ในการสร้าง subshell ฉันคิดว่าวงเล็บจะสร้าง subshell เสมอซึ่งจะทำงานเหมือนกระบวนการของตัวเอง อย่างไรก็ตามนี่ไม่ใช่กรณี ใน Code Snippet A (ด้านล่าง) sleepคำสั่งที่สองไม่ได้ทำงานในเชลล์แยกต่างหาก (ตามที่กำหนดโดยpstreeเทอร์มินัลอื่น) อย่างไรก็ตามใน Code Snippet B sleepคำสั่งที่สองจะทำงานในเชลล์แยกต่างหาก ความแตกต่างเพียงอย่างเดียวระหว่างตัวอย่างก็คือตัวอย่างที่สองมีสองคำสั่งภายในวงเล็บ มีใครบ้างที่โปรดอธิบายกฎสำหรับตอนที่สร้าง subshells รหัส SNIPET A: sleep 5 ( sleep 5 ) รหัส SNIPET B: sleep 5 ( x=1 sleep 5 )

3
สคริปต์นี้ทำให้แน่ใจได้อย่างไรว่ามีเพียงตัวเดียวเท่านั้นที่กำลังทำงานอยู่
ในวันที่ 19 ส.ค. 2556 Randal L. Schwartzโพสต์สคริปต์เชลล์นี้ซึ่งมีจุดประสงค์เพื่อให้แน่ใจว่าบน Linux "ว่ามีเพียงหนึ่งตัวอย่างของสคริปต์ [the] ที่กำลังทำงานโดยไม่มีเงื่อนไขการแข่งขันหรือต้องล้างไฟล์ล็อค": #!/bin/sh # randal_l_schwartz_001.sh ( if ! flock -n -x 0 then echo "$$ cannot get flock" exit 0 fi echo "$$ start" sleep 10 # for testing. put the real task here echo "$$ end" ) < $0 ดูเหมือนว่าจะทำงานตามที่โฆษณาไว้: …

2
ทำไมตัวแปรจึงมองเห็นได้ใน subshell
Learning Bash Book กล่าวถึงว่า subshell จะสืบทอดเฉพาะตัวแปรสภาพแวดล้อมและ file descriptors ฯลฯ และจะไม่รับสืบทอดตัวแปรที่ไม่ได้ถูกส่งออก: $ var=15 $ (echo $var) 15 $ ./file # this file include the same command echo $var $ ฉันรู้ว่าเชลล์จะสร้างสอง subshell สำหรับ()และ for ./fileแต่ทำไมใน()กรณีที่ subshell ระบุvarตัวแปรแม้ว่าจะไม่ถูกส่งออกและใน./fileกรณีที่มันไม่ได้ระบุมัน? # Strace for () clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f24558b1a10) = 25617 # Strace for ./file clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, …
18 bash  shell  subshell 

1
ใน zsh ความแตกต่างระหว่าง cat <(cat) กับ cat | cat vs cat = (cat)?
ฉันคาดหวังcat &lt;(cat)และcat | catทำสิ่งเดียวกัน: คัดลอกบรรทัดจาก stdin ไปยัง stdout ความเข้าใจของฉันคือการที่ทั้งสองจะดำเนินการcatใน subshell การเปลี่ยนเส้นทาง subshell cat's stdout เพื่อไปป์ที่มีชื่อชั่วคราวและจากนั้นดำเนินการอื่นcatในเปลือกปัจจุบันกับ stdin มันเปลี่ยนเส้นทางไปยังท่อ แต่cat &lt;(cat)ช่วยให้ฉันพิมพ์ที่ terminal ของฉัน แต่ไม่มีเส้นที่นำเข้าได้รับการคัดลอกและ^Dล้มเหลวในการส่งสัญญาณEOF; cat | catทำงานได้ตามที่คาดหวัง จากการทดสอบเพิ่มเติมฉันได้ตรวจสอบว่าcat =(cat)มีปัญหาคล้ายกันcat &lt;(cat)แต่ใช้งานได้ตามที่คาดไว้: stdin ทั้งหมดไปจนถึงการ^Dคัดลอกไปยัง stdout ในครั้งเดียว ใครสามารถช่วยฉันเข้าใจสิ่งที่ zsh กำลังทำอยู่ภายใต้ประทุน?

7
รวบรวมรหัสทางออกของกระบวนการพื้นหลังแบบขนาน (เชลล์ย่อย)
สมมติว่าเรามีสคริปต์ทุบตีดังนี้: echo "x" &amp; echo "y" &amp; echo "z" &amp; ..... echo "Z" &amp; wait มีวิธีในการรวบรวมรหัสทางออกของกระบวนการย่อย / กระบวนการย่อยหรือไม่? กำลังมองหาวิธีการทำสิ่งนี้และหาอะไรไม่เจอ ฉันต้องเรียกใช้ subshells เหล่านี้ในแบบคู่ขนานมิฉะนั้นจะทำได้ง่ายกว่านี้ ฉันกำลังมองหาโซลูชันทั่วไป (ฉันมีกระบวนการย่อยจำนวนไม่ทราบ / แบบไดนามิกเพื่อให้ทำงานแบบขนาน)

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 …

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 …

3
อะไรคือความแตกต่างที่แน่นอนระหว่าง“ subshell” และ“ กระบวนการลูก”
ตามนี้และนี้เป็น subshell (…)จะเริ่มต้นโดยใช้วงเล็บ ( echo "Hello" ) ตามนี้ , นี้และนี้เป็นกระบวนการที่คดเคี้ยวเมื่อคำสั่งจะถูกเริ่มต้นด้วย&amp; echo "Hello" &amp; ข้อกำหนด Posix ใช้คำsubshellในหน้านี้แต่ไม่ได้กำหนดและยังอยู่ในหน้าเดียวกันที่ไม่ได้กำหนด "กระบวนการเด็ก" ทั้งสองกำลังใช้fork()ฟังก์ชันเคอร์เนลใช่ไหม อะไรคือความแตกต่างที่แน่นอนในการเรียกส้อม "sub-shell" และส้อมอื่น ๆ เรียกว่า "child process"
16 bash  shell  subshell 

3
กับดักได้รับมรดกโดย subshell หรือไม่
ฉันลองใช้สคริปต์ต่อไปนี้: #!/bin/bash trap 'echo "touching a file" &amp;&amp; touch $FILE' EXIT foo1(){ echo "foo1" } foo(){ echo "foo" export FILE=${FILE:-/tmp/file1} } (foo1) foo ผลลัพธ์สำหรับสคริปต์ข้างต้นคือ: [root@usr1 my_tests]# ./test.sh foo1 foo touching a file อย่างไรก็ตามฉันคาดหวังว่ากับดักจะถูกเรียกเมื่อออกจากfoo1เช่นกันซึ่งเรียกว่าใน subshell คาดหวังหรือไม่ มีการtrapสืบทอดโดย subshell หรือไม่ ถ้าใช่แล้วในกรณีใดที่trapสืบทอดโดย subshell?
14 shell  trap  subshell 

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