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

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

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

1
อะไรคือความมหัศจรรย์ที่ทำให้ฉันสามารถรีโมตไฟล์แบบแท็บขณะที่ฉันพิมพ์คำสั่ง scp
สันนิษฐานว่านี่เป็นคุณสมบัติที่มีให้โดยปลั๊กอินบางตัวที่ฉันเปิดใช้งานในการตั้งค่า oh-my-zsh ของฉัน (ฉันใช้ zsh มาหลายปีแล้ว) ฉันสังเกตเห็นตั้งแต่ฉันเพิ่มพับลิกคีย์ของฉันไปยังเซิร์ฟเวอร์ (ตอนนี้ฉันสามารถ SSH ไปยังเซิร์ฟเวอร์โดยไม่ต้องป้อนรหัสผ่าน) เมื่อฉันเขียนscpคำสั่งในเชลล์ของฉันฉันสามารถพา ธ ไฟล์รีโมตแบบแท็บได้จริง ๆ ! เช่น $ diff <(scp Remoteuser@remote.domain.net:/var/www/html/ ฉันกดแท็บแล้วใช้งานได้! (สำหรับสิ่งที่ฉันพยายามทำให้สำเร็จด้วยคำสั่งเองฉันจะใช้scpเพื่อ "คัดลอก" ไปยัง stdout และให้อาหารเป็นไฟล์ต่าง ๆ ด้วยวิธีนี้ฉันสามารถเห็นการเปลี่ยนแปลงที่แน่นอนที่ฉันปรับใช้กับเซิร์ฟเวอร์ก่อน วิ่งrsync) ฉันอยากรู้ว่าชิ้นส่วนใดที่ทำให้งานนี้เป็นอย่างดี มันเป็นสิ่งที่สร้างไว้ใน scp ที่รวมเข้ากับ z shell หรือไม่? หรืออย่างอื่น?

3
เหตุผลใดที่จะใช้หรือสอนการทดแทน '…' เพื่อการพัฒนาใหม่?
มันเป็นความเข้าใจของฉันว่า$(...)ไวยากรณ์แทนคำสั่งที่ทันสมัยกว่าเป็นที่ต้องการมากกว่า`ไวยากรณ์แบบเก่าเนื่องจากง่ายต่อการทำรังและหลบหนีจากข้อผิดพลาด นอกจากนี้ดูเหมือนว่า/bin/shกระสุนสไตล์ส่วนใหญ่ในการสนับสนุนการใช้งานที่ทันสมัย$(…): ทุบตี เถ้า (และดังนั้น BusyBox, Linux ส่วนใหญ่ที่ฝังตัว) ชน FreeBSD / bin / sh และ$(…)ถูกระบุโดย IEEE 1003.1 ดังนั้นฉันมี 2 คำถามที่เกี่ยวข้องมาก: มีเหตุผลใดบ้างที่จะใช้ `ในการพัฒนาเชลล์สคริปต์ใหม่เว้นแต่คุณจะรู้ถึงระบบเก่าที่สคริปต์จะต้องทำงาน มีเหตุผลใดที่จะไม่สอนนักเรียนโปรแกรม UNIX เพียงเพื่อเขียน$(...)และอภิปราย`เฉพาะในรูปแบบที่ล้าสมัยที่พวกเขาจะพบถ้าพวกเขากำลังอ่านเชลล์สคริปต์ของผู้พัฒนาคนอื่น (และอาจจำเป็นถ้าพวกเขากำลังทำงานกับระบบเก่าหรือไม่เป็นมาตรฐาน ด้วยเหตุผลบางอย่าง)?

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

1
เปอร์เซ็นต์ในตัวแปรสภาพแวดล้อม $ PATH
$ PATH ของฉันมีลักษณะดังนี้: /home/torbjorr/deployed/vector/x86_64-GNU%2fLinux:/home/torbjorr/deployed/typewriter/x86_64-GNU%2fLinux:/home/torbjorr/deployed/mustudio/x86_64-GNU%2fLinux:/home/torbjorr/deployed/mathext/x86_64-GNU%2fLinux:/home/torbjorr/deployed/doxymax/x86_64-GNU%2fLinux:/home/torbjorr/deployed/c2tex/x86_64-GNU%2fLinux:/home/torbjorr/deployed/x86_64-GNU%2fLinux/wand:/home/torbjorr/deployed/x86_64-GNU%2fLinux/spellesc:/home/torbjorr/deployed/x86_64-GNU%2fLinux/projinit:/home/torbjorr/deployed/x86_64-GNU%2fLinux/herbs:/home/torbjorr/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games ในทุบตีฉันสามารถไม่มีปัญหาเรียกคันตั้งอยู่ใน /home/torbjorr/deployed/x86_64-GNU%2fLinux/wand ชอบ $ wand (i) Mål från "main.cpp" har registrerats (i) Skapar katalog "__wand_targets_dbg" (i) Kör g++ "main.cpp" -fpic -L"/home/torbjorr/deployed" -g -Wall -std=c++11 -I"/home/torbjorr/deployed" -o "__wand_targets_dbg/cb-template อย่างไรก็ตามในโหมดความเข้ากันได้ของเชลล์ bourne ไม่พบไม้กายสิทธิ์: $ wand sh: 2: wand: not found ดูเหมือนว่าปัญหาคือเครื่องหมาย% ในพา ธ เหล่านี้ เครื่องหมายนี้ได้รับการเพิ่มโดยการเข้ารหัส URL เพื่อให้สามารถใช้ชื่อ "GNU / …
16 shell  path  dash  ash 

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

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

2
ไม่สามารถขยายเครื่องหมายดอกจันโดยไม่ได้รับอนุญาต
บางคนสามารถอธิบายต่อไปนี้ให้ฉันได้หรือไม่ $ ls -ld /temp/sit/build/ dr-xr-s--- 3 asdf qwer 4096 Jan 31 2012 /temp/sit/build/ $ ls -ld /temp/sit/build/* ls: /temp/sit/build/*: Permission denied เห็นได้ชัดว่าฉันไม่สามารถใช้เครื่องหมายดอกจันที่นี่ ฉันลองด้วยคำสั่ง sudo และฉันได้รับข้อผิดพลาด "ไม่มีไฟล์ดังกล่าว" แทนที่จะ "ปฏิเสธสิทธิ์" ... sudo ls -l /temp/sit/build/* ls: /temp/sit/build/batch*: No such file or directory แต่ในที่สุดก็ใช้งานได้หากฉันไม่ได้ใช้ * sudo ls -l /temp/sit/build/ total 4 dr-xr-s--- …

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

2
ฉันจะอ้างอิงตัวแปรใน fish shell โดยใช้ทางเลือกเริ่มต้นได้อย่างไร
เปลือกปลาเทียบเท่ากับ bash ต่อไปนี้คืออะไร: echo ${TEST:-1} ในทุบตีนี้จะพิมพ์ค่าของการทดสอบถ้ามีอย่างใดอย่างหนึ่งหรือ 1 หากไม่มี
16 shell  fish 

2
การดำเนินการคำสั่ง piped ในแบบคู่ขนาน
พิจารณาสถานการณ์สมมติต่อไปนี้ ฉันมีสองโปรแกรม A และ B. โปรแกรม A เอาต์พุตไปยัง stdout บรรทัดของสตริงในขณะที่โปรแกรม B ประมวลผลบรรทัดจาก stdin วิธีใช้โปรแกรมทั้งสองนี้เป็นของหลักสูตร: foo @ bar: ~ $ A | B ตอนนี้ฉันสังเกตเห็นว่านี่กินแกนเดียวเท่านั้น ดังนั้นฉันสงสัย: โปรแกรม A และ B แชร์ทรัพยากรการคำนวณเดียวกันหรือไม่ ถ้าเป็นเช่นนั้นจะมีวิธีเรียกใช้ A และ B พร้อมกันไหม อีกสิ่งหนึ่งที่ฉันสังเกตเห็นคือ A ทำงานเร็วกว่า B มากฉันจึงสงสัยว่าจะสามารถรันโปรแกรม B เพิ่มเติมได้หรือไม่และให้พวกเขาประมวลผลบรรทัดที่เอาท์พุทแบบขนาน นั่นคือ A จะเอาต์พุตบรรทัดของมันและจะมีอินสแตนซ์ N ของโปรแกรม B ที่จะอ่านบรรทัดเหล่านี้ (ใครก็ตามที่อ่านก่อน) ประมวลผลและส่งออกใน …

3
การยกเลิกสคริปต์เชลล์ bash ที่รันในพื้นหลัง
ฉันมักจะใช้bashเชลล์สคริปต์เพื่อรันคำสั่งง่าย ๆ สำหรับไฟล์ที่แตกต่างกัน ตัวอย่างเช่นสมมติว่าฉันมีดังต่อไปนี้bashเชลล์สคริปต์เรียกscript.shว่ารันโปรแกรม / คำสั่งfooสามไฟล์ข้อความ"a.txt", "b.txt", "c.txt": #!/bin/bash for strname in "a" "b" "c" do foo $strname".txt" done นอกจากนี้สมมติว่าfoo $strname".txt"ช้าดังนั้นการเรียกใช้สคริปต์จะใช้เวลานาน (ตัวอย่างเช่นชั่วโมงหรือวัน) ด้วยเหตุนี้ฉันต้องการใช้nohupเพื่อให้การดำเนินการต่อไปแม้ว่าเทอร์มินัลจะปิดหรือตัดการเชื่อมต่อ ฉันต้องการให้สคริปต์ไปที่พื้นหลังทันทีดังนั้นฉันจะใช้&โอเปอเรเตอร์ ดังนั้นฉันจะใช้คำสั่งต่อไปนี้เพื่อโทรscript.sh: nohup bash script.sh & วิธีนี้ใช้งานได้ดีสำหรับการเรียกใช้สคริปต์ในพื้นหลังและไม่มีการแฮงค์ แต่ตอนนี้สมมติว่าฉันต้องการยุติการประมวลผลในบางจุดด้วยเหตุผลบางอย่าง ฉันจะทำสิ่งนี้ได้อย่างไร ปัญหาที่ฉันได้พบก็คือว่าโดยดูที่topผมเห็นเพียงที่สอดคล้องกับfoo "a.txt"ฉันสามารถยุติการfooโทรนั้นได้ แต่จากนั้นการโทรที่fooสอดคล้องกันจะ"b.txt"ได้รับการเรียกและจากนั้นฉันต้องยุติการโทรนั้นเช่นกันและต่อไปเรื่อย ๆ สำหรับไฟล์ข้อความหลายสิบหรือร้อยไฟล์ที่ระบุในforลูปมันจะกลายเป็นความเจ็บปวดที่จะยกเลิกทุก ๆไฟล์ทีละไฟล์foo! ดังนั้นฉันต้องยกเลิกเชลล์สคริปเองแทนการโทรเฉพาะที่ออกจากเชลล์สคริป เมื่อฉันพิมพ์คำสั่ง ps -u myusername myusernameชื่อผู้ใช้ของฉันอยู่ที่ไหนฉันได้รับรายการกระบวนการที่ฉันใช้อยู่ bashแต่ผมเห็นสองรหัสกระบวนการที่แตกต่างกันเรียกว่า ฉันจะรู้ได้อย่างไรว่ากระบวนการเหล่านี้ถ้ามีการสอดคล้องกับการเรียกร้องเดิมของฉันnohup bash script.sh &?

2
วิธีการวนซ้ำอาร์กิวเมนต์ในสคริปต์ทุบตี
ฉันต้องการเขียนสคริปต์ทุบตีด้วยจำนวนอาร์กิวเมนต์ที่ไม่รู้จัก ฉันจะเดินผ่านข้อโต้แย้งเหล่านี้และทำอะไรกับพวกเขาได้อย่างไร ความพยายามที่ผิดจะมีลักษณะเช่นนี้: #!/bin/bash for i in $args; do echo $i done
16 bash  shell  arguments 

4
วิธีส่งคำสั่งจำนวนมากไปยัง shell และรอให้คำสั่งด้านหลังลงท้ายด้วย [ปิด]
ปิด คำถามนี้ต้องการรายละเอียดหรือความคมชัด ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ เพิ่มรายละเอียดและชี้แจงปัญหาโดยแก้ไขโพสต์นี้ ปิดให้บริการใน2 ปีที่ผ่านมา ฉันมีคำสั่งประมาณ 20 คำสั่งและฉันต้องส่งสิ่งนี้ทั้งหมดไปยัง Unix shell และคัดลอกผลลัพธ์ แต่ฉันไม่รู้ว่าจะทำอย่างไร ฉันไม่แน่ใจเกี่ยวกับเชลล์ที่ฉันมีเพราะเป็นโปรแกรมขนาดเล็กที่เชื่อมต่อกับการจัดการเครือข่ายมือถือและด้วยโปรแกรมขนาดเล็กนี้เราสามารถเข้าถึงเพื่อส่งคำสั่งตามบรรทัดและรับผลลัพธ์โดยกรีดร้องด้วยเหตุนี้ฉันจึงไม่สามารถใช้สคริปต์สำหรับ ส่งคำสั่ง คำสั่ง 1 - เชื่อมต่อกับเซิร์ฟเวอร์ รอจนกว่าคำสั่ง 1 เสร็จสิ้น คำสั่ง 2 - อัปเดตข้อมูลทั้งหมดจากเซิร์ฟเวอร์ 1 เสร็จสิ้น รอ. 3 คำสั่ง รับพารามิเตอร์ ... และคำสั่งอื่น ๆ อีกมากมาย ฉันพยายามด้วยcmd1 | cmd2 | cmd3 และ cmd1 & cmd2 & cmd3และcmd1;cmd2 ปัญหาเกิดcmd1จากการเชื่อมต่อกับ RNC …


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