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

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

3
วิธีใช้ inotifywait เพื่อดูไดเร็กทอรีสำหรับการสร้างไฟล์ของส่วนขยายเฉพาะ
ฉันเห็นคำตอบนี้แล้ว คุณควรพิจารณาใช้ inotifywait เป็นตัวอย่าง: inotifywait -m /path -e create -e moved_to | while read path action file; do echo "The file '$file' appeared in directory '$path' via '$action'" # do something with the file done คำถามของฉันคือสคริปต์ข้างต้นดูไดเรกทอรีสำหรับการสร้างไฟล์ทุกประเภท แต่ฉันจะแก้ไขinotifywaitคำสั่งเพื่อรายงานได้เฉพาะเมื่อไฟล์ประเภท / นามสกุลที่แน่นอนถูกสร้างขึ้น (หรือย้ายไปยังไดเรกทอรี) - เช่นควร รายงานเมื่อ.xmlมีการสร้างไฟล์ใด ๆ ฉันลองอะไร: ฉันรันinotifywait --helpคำสั่งแล้วและอ่านตัวเลือกบรรทัดคำสั่ง มันมี--exclude <pattern>และ--excludei <pattern>คำสั่งในการยกเว้นไฟล์บางประเภท …

1
ความหมายของ 'ln -sf' ใน Linux คืออะไร
ฉันมี 2 คำถาม ตัวแรกคือ-sfตัวเลือกและตัวที่สองสำหรับการใช้งาน-fตัวเลือกที่เฉพาะเจาะจงมากขึ้น โดย googling ฉันคิดออกคำอธิบายของคำสั่งlnตัวเลือกและ-s-f (คัดลอกจากhttp://linux.about.com/od/commands/l/blcmdl1_ln.htm ) -s, --symbolic : make symbolic links instead of hard links -f, --force : remove existing destination files ฉันเข้าใจตัวเลือกเหล่านี้เป็นรายบุคคล แต่วิธีที่สามารถใช้นี้-sและ-fตัวเลือกพร้อมกัน? -sใช้สำหรับสร้างไฟล์ลิงค์และ-fใช้สำหรับลบไฟล์ลิงค์ ฉันไม่เข้าใจสถานการณ์นี้และเหตุใดจึงต้องใช้ตัวเลือกการผสานนี้ หากต้องการทราบข้อมูลเพิ่มเติมเกี่ยวกับlnคำสั่งฉันได้ทำตัวอย่าง $ touch foo # create sample file $ ln -s foo bar # make link to file $ vim …
21 shell  ln 

5
วิธีจับคู่ * กับไฟล์ที่ซ่อนอยู่ในไดเรกทอรี
วิธีจับคู่ไฟล์ที่ซ่อนอยู่ในไดเรกทอรีที่กำหนด ตัวอย่างเช่น ถ้าฉันให้คำสั่งด้านล่างมันไม่ได้ให้ผลลัพธ์ของไฟล์ที่ซ่อนอยู่ du -b maybehere*/* วิธีการทำให้ง่าย ๆ นี้โดยใช้คำสั่งเดียวแทนที่จะใช้ du -b maybehere*/.* maybehere*/* เพราะฉันต้องพิมพ์บางทีสองครั้ง

3
วิธีการ“ ถูกต้อง” เริ่มโปรแกรมประยุกต์จากเปลือก
ฉันพบว่ามันยากที่จะตอบคำถามอย่างแม่นยำ แต่ฉันจะทำให้ดีที่สุด ฉันใช้dwmเป็นตัวจัดการหน้าต่างเริ่มต้นและdmenuเป็นตัวเรียกใช้แอปพลิเคชันของฉัน ฉันแทบจะไม่ได้ใช้แอปพลิเคชัน GUI นอกเหนือจากเบราว์เซอร์ของฉัน งานส่วนใหญ่ของฉันทำได้โดยตรงจากบรรทัดคำสั่ง นอกจากนี้ฉันเป็นแฟนตัวยงของความเรียบง่ายเกี่ยวกับระบบปฏิบัติการแอปพลิเคชั่นและอื่น ๆ หนึ่งในเครื่องมือที่ฉันไม่เคยได้รับคือตัวเปิดแอปพลิเคชัน สาเหตุหลักมาจากฉันขาดความเข้าใจที่แม่นยำในการทำงานของโปรแกรมเรียกใช้งาน / สิ่งที่พวกเขาทำ แม้การค้นหาทางอินเทอร์เน็ตที่ครอบคลุมจะแสดงคำอธิบายที่คลุมเครือเท่านั้น สิ่งที่ฉันต้องการจะทำคือกำจัดแม้กระทั่งตัวเรียกใช้งานแอปพลิเคชันของฉันเพราะนอกเหนือจากการวางไข่แอปพลิเคชันจริง ๆ แล้วฉันไม่ได้ใช้มันอย่างแน่นอน ในการทำเช่นนี้ฉันอยากจะรู้วิธีการ "เริ่มต้น" แอปพลิเคชันจากเปลือก โดยที่ความหมายของ "ถูกต้อง" สามารถประมาณได้โดย "เหมือนตัวเรียกใช้งานแอปพลิเคชันจะทำ" ฉันรู้เกี่ยวกับวิธีต่อไปนี้เพื่อวางไข่กระบวนการจากเปลือก: exec /path/to/Program แทนที่เชลล์ด้วยคำสั่งที่ระบุโดยไม่ต้องสร้างกระบวนการใหม่ sh -c /path/to/Program เรียกใช้กระบวนการที่ขึ้นกับเชลล์ /path/to/Program เรียกใช้กระบวนการที่ขึ้นกับเชลล์ /path/to/Program 2>&1 & เรียกใช้กระบวนการอิสระเชลล์ nohup /path/to/Program & เรียกใช้กระบวนการเชลล์อิสระและเปลี่ยนทิศทางเอาต์พุตไปที่ nohup.out อัปเดต 1: ฉันสามารถแสดงให้เห็นว่าอะไรเช่นdmenuสร้างใหม่จากการโทรซ้ำไปยังps -eflเงื่อนไขที่แตกต่างกัน มัน spawns เปลือกใหม่และเป็นลูกของนี้เปลือกแอพลิเคชัน/bin/bash …
21 shell  exec 

4
'IFS' คืออะไร
ฉันอ่านกระทู้นี้: วิธีการวนรอบไฟล์? คือIFSอะไร และการใช้งานในบริบทของ - forลูปคืออะไร?
21 bash  shell 

4
touch: ไม่สามารถสัมผัส `foo ': ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว
สิ่งที่อาจทำให้เกิดการสัมผัสล้มเหลวพร้อมกับข้อความแสดงข้อผิดพลาดนี้? touch: cannot touch `foo': No such file or directory โปรดทราบว่าข้อผิดพลาดเนื่องจากการอนุญาตที่ไม่ถูกต้องมีลักษณะแตกต่างกัน: touch: cannot touch `foo': Permission denied
21 linux  shell  touch 

6
วิธีย้ายไฟล์ x ไฟล์แรก
ฉันมีโฟลเดอร์ใหญ่นี้ที่มีไฟล์เรียงลำดับหลายพันไฟล์ เป็นไปได้ไหมที่จะย้าย 5000s แรกไปยังโฟลเดอร์ย่อยผ่านmvคำสั่ง? ตอนนี้ฉันย้ายไฟล์ด้วย mv *some_pattern* ./subfolder1/ สำหรับตอนนี้ฉันย้ายภาพไปมาโดยการสุ่มมันไม่สำคัญจริงๆถ้ามีไฟล์ไม่ถึง 5,000 ไฟล์ในแต่ละโฟลเดอร์ย่อย มีวิธีที่ดีกว่าที่จะทำหรือไม่

3
จะเปลี่ยนสิทธิ์จากผู้ใช้รูทเป็นผู้ใช้ทั้งหมดได้อย่างไร?
ฉันสร้างโฟลเดอร์บนบรรทัดคำสั่งในฐานะผู้ใช้รูท ตอนนี้ฉันต้องการแก้ไขและเนื้อหาในโหมด GUI ฉันจะเปลี่ยนการอนุญาตเพื่อให้ฉันทำเช่นนี้ได้อย่างไร

5
เอาท์พุทบรรทัดทั่วไป (ความเหมือน) ของไฟล์ข้อความสองไฟล์ (ตรงกันข้ามกับ diff)?
Diff เป็นเครื่องมือที่ยอดเยี่ยมในการแสดงการเปลี่ยนแปลงระหว่างสองไฟล์ แต่วิธีการแสดงความคล้ายคลึงกันของไฟล์ข้อความสองไฟล์ (ในขณะที่ละเว้นความแตกต่าง)? Ie ตัวอย่างอินพุต: a: Foo Bar X Hello World 42 b: Foo Baz Hello World 23 Pseudo output (บางอย่างเช่นนี้): @@ 2,3 =Hello World เพียงแค่เรียงลำดับทั้งไฟล์และการใช้งานคอมไม่เพียงพอเพราะในกรณีนี้ข้อมูลเส้นจะหายไป

4
มี POSIX (หรืออย่างน้อยเป็นที่นิยม) ยูทิลิตี้เพื่อตั้งไดเรกทอรีการทำงานปัจจุบันเมื่อเรียกใช้โปรแกรมหรือไม่?
เรามีenv (1)เพื่อแก้ไขสภาพแวดล้อมของคำสั่งที่เราต้องการเรียกใช้ (ตัวอย่างenv MANPAGER=more man dtrace) มีสิ่งที่คล้ายกัน แต่สำหรับการปรับเปลี่ยนไดเรกทอรีที่คำสั่งจะเริ่มต้นใน เป็นการดีที่ฉันต้องการให้มีลักษณะเช่นนี้: theMagicCommand /new/cwd myProgram วิธีนี้มันอาจจะ "ถูกล่ามโซ่" กับคำสั่ง env (1) เหมือนอื่น ๆ เช่น daemon -p /tmp/pid env VAR=value theMagicCommand /new/cwd myProgram จนถึงตอนนี้ฉันสามารถคิดถึงวิธีแก้ปัญหาต่อไปนี้ซึ่งน่าเสียดายที่ไม่มีอินเตอร์เฟสเหมือนกับ env (1): cd /new/cwd && myProgram นอกจากนี้ฉันสามารถสร้างเชลล์สคริปต์อย่างง่ายเช่นนี้: #! /bin/sh - cd "${1:?Missing the new working directory}" || exit 1 shift exec …
20 shell  freebsd  cwd 

1
ทำไม -a ใน“ #! / bin / sh -a” ส่งผลกระทบต่อ sed และ“ set -a” ไม่?
ถ้าฉันเรียกใช้ไฟล์. sh ต่อไปนี้: #!/bin/sh -a echo "a" | sed -e 's/[\d001-\d008]//g' ผลลัพธ์เป็นข้อผิดพลาด: sed: -e นิพจน์ # 1, อักขระ 18: ช่วงสิ้นสุดไม่ถูกต้อง แต่ถ้าฉันเรียกใช้ไฟล์. sh ต่อไปนี้: #!/bin/sh set -a echo "a" | sed -e 's/[\d001-\d008]//g' มันทำงานโดยไม่มีข้อผิดพลาด รหัสที่สองไม่ควรจะเทียบเท่ากับรหัสแรก? ทำไมข้อผิดพลาดในอันแรก?

2
ทำไมพฤติกรรมของ `คำสั่ง 1> file.txt 2> file.txt` ต่างจาก` คำสั่ง 1> file.txt 2> & 1`
เมื่อคุณต้องการเปลี่ยนเส้นทางทั้ง stdout และ stderr ไปยังแฟ้มเดียวกันคุณสามารถทำมันได้โดยการใช้หรือcommand 1>file.txt 2>&1 command &>file.txtแต่ทำไมพฤติกรรมcommand 1>file.txt 2>file.txtต่างไปจากสองคำสั่งข้างต้น? ต่อไปนี้เป็นคำสั่งการตรวจสอบ $ cat redirect.sh #!/bin/bash { echo -e "output\noutput" && echo -e "error" 1>&2; } 1>file.txt 2>&1 { echo -e "output\noutput" && echo -e "error" 1>&2; } 1>file1.txt 2>file1.txt { echo -e "error" 1>&2 && echo -e "output\noutput"; } …

3
ฉันจะดูได้อย่างไรว่าคำสั่งใดทำงานในเชลล์ผ่านนามแฝงหรือฟังก์ชั่น
ฉันมีฟังก์ชั่นทุบตี (หรือนามแฝง) function install() {sudo apt-get install $@}ตัวอย่างเช่น เมื่อใช้คำสั่งสิ่งที่ผมคาดว่าจะจริงจะทำงานเป็นinstall dicelab sudo apt-get install dicelabฉันจะดูได้ว่าอะไรที่เชลล์ใช้งานจริง? ฉันต้องการตรวจสอบให้แน่ใจว่านามแฝงที่ซับซ้อนของฉันทำงานได้ตามที่คาดไว้
20 bash  shell  debugging 

2
คำพูดซ้อนคู่ในหนึ่งคะแนนโหวตสูง
คำตอบ StackOverflow ด้วย> 3.5K โหวตให้คุณสมบัติหนึ่งซับสำหรับการกำหนดไปDIRยังไดเรกทอรีของสคริปต์ทุบตีปัจจุบัน: DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" ฉันงงกับคำพูดซ้อนคู่ เท่าที่ฉันสามารถบอกได้ชิ้นส่วนต่อไปนี้เป็นเครื่องหมายคำพูดคู่: "$( cd " "${BASH_SOURCE[0]}" " && pwd )" ... และทุกอย่างอื่นทางด้านขวาของ=(เช่น$( dirnameและ)) ไม่มีการอ้างอิง ในคำอื่น ๆ ฉันคิดว่าตัวละครที่ 2, 4 และ 6 ""ปิด" ตัวที่ 1, 3 และ 5 "ตามลำดับ ฉันเข้าใจว่าการเสนอราคาสองเท่าในการ"${BASH_SOURCE[0]}"บรรลุผลสำเร็จ แต่อะไรคือจุดประสงค์ของการเสนอราคาสองคู่อื่น ๆ หากในอีกทางหนึ่ง (และคะแนนโหวตสูงถึงแม้จะมี) ตัวอย่างข้างต้นไม่ถูกต้องสิ่งที่เป็นวิธีที่เหมาะสมเพื่อให้บรรลุเจตนาที่ระบุ? (โดยเจตนาที่ระบุฉันหมายถึง: รวบรวมค่าที่ส่งคืนโดยpwdหลังจากการcdเข้าสู่ไดเรกทอรีที่ส่งคืนโดยครั้งแรกdirname …

3
`<& -` ทำอะไร
ฉันคัดลอกตัวอย่างของ Bash ไปยังพื้นหลังคำสั่ง ssh ที่ดำเนินการจากระยะไกล: ssh user@remote &lt;&lt;CMD some process &lt;&amp;- &gt;log 2&gt;error &amp; CMD อะไร&lt;&amp;-ทำอย่างไร ฉันเดาว่ามันเหมือนกับ&lt; /dev/null ความเข้าใจต่อไปของฉันอยู่ที่สามอธิบายไฟล์หลัก ( stdin, stdout, stderr) จะต้องมีการปิดเพื่อป้องกัน: งานที่อยู่เบื้องหลังและออกจากสคริปต์ - ขัดแย้งกันอย่างไร? เมื่อปิดเทอร์มินัลกระบวนการทั้งหมดที่ยอมรับ stdin จากเทอร์มินัลจะปิด?

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