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

เชลล์เป็นอินเตอร์เฟสบรรทัดคำสั่งของ Unix คุณสามารถพิมพ์คำสั่งในเชลล์แบบโต้ตอบหรือเขียนสคริปต์เพื่อทำงานอัตโนมัติ ใช้แท็กนี้สำหรับคำถามที่ใช้กับ / bin / sh และเชลล์ที่เข้ากันได้มากที่สุด (ash, bash, ksh, zsh, …) สำหรับเชลล์สคริปต์ที่มีข้อผิดพลาดโปรดตรวจสอบใน http://shellcheck.net ก่อนโพสต์ที่นี่

1
ทำไมฉันไม่สามารถพิมพ์ตัวแปรที่ฉันเห็นได้ในผลลัพธ์ของ env
ฉันสนใจที่จะตั้งค่าตัวแปรสภาพแวดล้อมของเชลล์อินสแตนซ์หนึ่งจากอีกอันหนึ่ง ฉันจึงตัดสินใจทำการวิจัย หลังจากอ่านคำถามจำนวนหนึ่งเกี่ยวกับเรื่องนี้ฉันตัดสินใจที่จะทดสอบ ผมสองกระบอกเปลือกหอย A และ B (PID 420) zshทั้งการทำงาน จาก AI เชลล์วิ่งต่อไปนี้ sudo gdb -p 420 (gdb) call setenv("FOO", "bar", 1) (gdb) detach จาก shell B เมื่อฉันรันenvฉันเห็นตัวแปร FOO ถูกตั้งค่าด้วยค่าบาร์ นี่ทำให้ฉันคิดว่า FOO ได้รับการเริ่มต้นได้สำเร็จในสภาพแวดล้อมของ shell B อย่างไรก็ตามถ้าฉันพยายามพิมพ์ FOO ฉันจะได้รับบรรทัดว่างซึ่งหมายความว่าไม่ได้ตั้งค่าไว้ สำหรับฉันมันรู้สึกเหมือนมีความขัดแย้งที่นี่ สิ่งนี้ได้รับการทดสอบทั้งในระบบ Arch GNU / Linux ของฉันและ Ubuntu VM ฉันยังทดสอบสิ่งนี้bashว่าตัวแปรไม่ได้แสดงใน env แม้ว่ามันจะน่าผิดหวังสำหรับฉัน …


3
ตัวแปรแบบฟอร์มนี้คืออะไร = $ (…)
หมายความว่าอะไรต่อไปนี้: basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") ฉันสนใจเป็นพิเศษในส่วนนี้: varible=$(...) ฉันรู้ว่าจะใช้วงเล็บในการดำเนินการ subprocess แต่ถ้าพวกเขาจะใช้ร่วมกับ$?
9 shell 



4
โปรแกรม Bash ไม่ทำงานหากการเปลี่ยนเส้นทางจะล้มเหลว
ใน bash ฉันสังเกตเห็นว่าหากคำสั่งที่ใช้การเปลี่ยนเส้นทางจะล้มเหลวโปรแกรมใด ๆ ที่ทำงานก่อนหน้านั้นจะไม่ทำงาน ตัวอย่างเช่นโปรแกรมนี้เปิดไฟล์ "a" และเขียน 50 ไบต์ไปยังไฟล์ "a" อย่างไรก็ตามการรันคำสั่งนี้ด้วยการเปลี่ยนเส้นทางไปยังไฟล์ที่มีสิทธิ์ไม่เพียงพอ (~ root / log) ทำให้ไม่มีการเปลี่ยนแปลงขนาดไฟล์ของ "a" $ ./write_file.py >> ~root/log -bash: /var/root/log: Permission denied cdal at Mac in ~/experimental/unix_write $ ls -lt total 16 -rw-rw-r-- 1 cdal staff 0 Apr 27 08:54 a <-- SHOULD BE 50 BYTES …

1
`\ time ',` t \ ime` และ `\ cd` จริง ๆ ทำอะไร? (สนุกกับแบ็กสแลชในเปลือกหอย)
ขณะที่คุยมากกว่าความแตกต่างระหว่าง/usr/bin/timeและเปลือก (ทุบตีและ zsh) ในตัวtimeใครบางคนบอกว่าหนึ่งสามารถใช้เป็นชวเลขที่จะได้รับ\time/usr/bin/time ครั้งแรกดูเหมือนว่าจะเป็นทางลัดที่ไร้เดียงสา แต่คำถามก็เกิดขึ้น ทำไมถึงt\imeทำงานเช่นกัน? ทำไมถึง\cdเปลี่ยนได/usr/bin/cdเร็กตอรี่ถึงแม้ว่า¹จะไม่เป็นเช่นนั้น? ดังนั้นเห็นได้ชัดว่าจะไม่เทียบเท่ากับ\foo $(which foo)คำถามคือตอนนี้: พฤติกรรมที่สังเกตได้ของ\fooทั้งใน bash และ zsh ในทุก ๆ ด้านที่ครอบคลุมโดยนิยาม POSIX ของเชลล์และถ้าเป็นเช่นนั้นทำไมมันมีพฤติกรรมเหมือนมัน? เชิงอรรถ 1: /usr/bin/cdคือบนระบบของฉัน #!/bin/sh builtin cd "$@"

5
วิธีการจัดกลุ่มบรรทัดในไฟล์สอง?
ฉันมีไฟล์ข้อความดังนี้: a b c d e f g ฉันจะจัดกลุ่มบรรทัดเหล่านั้นเพื่อรับเอาต์พุตดังนี้: a-b b-c c-d d-e e-f f-g ฉันต้องทำสิ่งนี้ในเปลือก (sh, csh, bash) ฉันได้พบสิ่งนี้: cat file | xargs -n2 แต่องค์ประกอบสุดท้ายของกลุ่มแรกไม่ได้กลายเป็นองค์ประกอบแรกของกลุ่มที่สอง

2
นามแฝงใหม่ไม่สามารถใช้ได้หลังจาก
ถึงตอนนี้ฉันคิดว่าเซมิโคลอนในเชลล์มีความหมายเดียวกับตัวแบ่งบรรทัด (อย่างใด) ดังนั้นฉันจึงแปลกใจที่สำหรับ alias <name>=<replacement text>; <name> <name>ไม่เป็นที่รู้จักในขณะที่มันเป็นที่รู้จักในบรรทัดถัดไป csh, tcsh, sh, kshและbashประพฤติเดียวกัน อย่างน้อยcshก็ไม่สำคัญว่าจะใช้นามแฝงโดยตรงหรือหากสคริปต์มีที่มาก่อนเซมิโคลอน - นามแฝงจะไม่รู้จัก;แต่จะรู้จักในบรรทัดคำสั่งถัดไป นี่เป็นข้อบกพร่องหรือพฤติกรรมนี้ตั้งใจหรือไม่
9 shell  alias 

3
บรรทัดใหม่ในตัวแปรทุบตี
ฉันพยายามเก็บหลายบรรทัดในตัวแปร bash แต่ดูเหมือนจะไม่ทำงาน ตัวอย่างเช่นถ้าฉันแสดง/binหนึ่งไฟล์ต่อบรรทัดและเก็บไว้ใน$LSนั้นฉันผ่าน$LSเป็น stdin ไปที่wcมันจะส่งกลับ 1 เสมอ: $ ls -1 /bin | wc -l 134 $ LS=$(ls -1 /bin); wc -l <<< $LS 1 ถ้าฉันพยายามที่จะส่งออกไปยังหน้าจอฉันได้รับผลลัพธ์ต่าง ๆ : echoพิมพ์บรรทัดทั้งหมดในบรรทัดเดียวในขณะที่printfพิมพ์เฉพาะบรรทัดแรก: #!/bin/bash LS=$(ls -1 /bin) echo $LS printf $LS ดังนั้นตัวแปร bash สามารถมีได้หลายบรรทัด?
9 bash  shell  quoting 

3
วิธีการพิมพ์อักขระควบคุมด้วย escape sequences?
ฉันกำหนดสีแดงโดยใช้ tput red=$(tput setaf 1) เพื่อ colorize คำเตือนในโปรแกรมของฉัน ใช้งานได้ดี: printf '%sfail\n' "$red" # prints 'fail' in red แต่มีอยู่ครั้งหนึ่งที่ฉันต้องการพิมพ์ลำดับหลบหนีตามที่เป็นอยู่สิ่งที่ชอบ: \ E [31mfail ฉันจะทำสิ่งนี้ได้อย่างไร ฉันรู้ว่า printf มี%qธง แต่สิ่งอื่น ๆ ที่ฉันไม่ต้องการหลบหนี

4
ย้ายไฟล์ตามวันที่ไปยังไดเรกทอรีอื่นโดยใช้ CLI
ฉันมีรูปภาพจำนวนมากจากฮาร์ดไดรฟ์เก่าที่ฉันพยายามจัดระเบียบ ถ้าฉันรันls -lฉันสังเกตว่าไฟล์เหล่านี้ทั้งหมดมีวันที่สร้างปี 2555 หรือก่อนหน้า โดยอุดมคติแล้วฉันต้องการย้ายสิ่งเหล่านี้ไปยังฮาร์ดไดรฟ์ที่สองของคอมพิวเตอร์ซึ่งไม่ได้ตั้งค่าให้ติดตั้งโดยอัตโนมัติ โดยเฉพาะอย่างยิ่งฉันสามารถทำสิ่งนี้ทั้งหมดเป็นชุดที่มีคำสั่งเชื่อมโยงกัน จนถึงตอนนี้ผมมีls -l | grep -i 2012ที่ถ่มน้ำลายออกเฉพาะไฟล์ที่มี 2012 ls -lในวันที่จัดไว้ให้โดย ทีนี้เคล็ดลับก็คือcp'ทุกไฟล์เหล่านั้นไปยังไดเรกทอรีใหม่ ฉันไม่แน่ใจว่าจะไปที่ไหนเพราะจะต้องคัดลอกแต่ละไฟล์ คำสั่งชุดถัดไปของฉันคืออะไร

1
ทำไมไม่มีบรรทัดใหม่ในตอนท้ายของการอ้างถึง subshell และส่งผ่านผลลัพธ์เพื่อ echo
เมื่อฉันทำls | grep pngผลลัพธ์ของ grep คือ: 2015-05-15-200203_1920x1080_scrot.png 2015-05-16-025536_1920x1080_scrot.png (ชื่อไฟล์ขึ้นบรรทัดใหม่ชื่อไฟล์ขึ้นบรรทัดใหม่) ดังนั้นecho $(ls | grep png)ผลลัพธ์: 2015-05-15-200203_1920x1080_scrot.png 2015-05-16-025536_1920x1080_scrot.png (ชื่อไฟล์, ช่องว่างจากการแยกคำ, ชื่อไฟล์, บรรทัดใหม่ !! จาก echo !!) นั่นคือทั้งหมดที่ตกลง แต่เมื่อฉันทำเช่นนี้เพื่อป้องกันการแยกคำ: echo "$(ls | grep png)"ออกเป็น: 2015-05-15-200203_1920x1080_scrot.png 2015-05-16-025536_1920x1080_scrot.png และคำถามของฉันคือขึ้นบรรทัดใหม่ที่สอง (หนึ่งควรมาจาก grep และหนึ่งจาก echo)

1
Linux: คำสั่ง set สำหรับตัวแปรโลคัล
ฉันพยายามทำความเข้าใจกับตัวแปรโลคัล / สภาพแวดล้อมและคำสั่งส่งออก / ตั้งค่า $ set FILEM="razrax" $ echo $FILEM $ FILEN="test" $ echo $FILEN test โปรดอธิบายว่าทำไมecho $FILEMส่งคืนสตริงว่าง
9 bash  shell  variable 

2
วิธีทุบตีปฏิบัติต่อ“>> ()”
ขณะทำการทดลองกับการเปลี่ยนเส้นทางเอาต์พุตและการทดแทนกระบวนการฉันพบคำสั่งต่อไปนี้และผลลัพธ์ที่ได้: me @ elem: ~ $ echo foo>> (cat); แถบสะท้อนเสียง บาร์ me @ elem: ~ $ foo (ใช่แล้วบรรทัดใหม่ที่ว่างที่สุดจะเป็นเจตนา) ดังนั้นทุบบาร์ของ echo พิมพ์พรอมต์ตามปกติของฉัน, foo ของ echo, ขึ้นบรรทัดใหม่, และปล่อยเคอร์เซอร์ของฉันไว้ที่นั่น หากฉันกด Enter อีกครั้งจะพิมพ์พรอมต์ของฉันในบรรทัดใหม่และปล่อยเคอร์เซอร์ไว้ตาม (ตามที่คาดไว้เมื่อมีคนกด Enter บนบรรทัดคำสั่งว่าง) ฉันคาดหวังว่ามันจะเขียน foo ให้กับ file descriptor cat อ่านมันและ echo's foo แถบ echo echo ที่สองจากนั้นกลับไปที่ command prompt แต่นั่นไม่ใช่กรณีที่ชัดเจน ใครช่วยอธิบายหน่อยได้ว่าเกิดอะไรขึ้น?

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