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

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

1
การทำความเข้าใจกับตัวเลือก -exec ของ `find '
ฉันพบว่าตัวเองกำลังค้นหาไวยากรณ์ของ find . -name "FILENAME" -exec rm {} \; ส่วนใหญ่เป็นเพราะฉันไม่เห็นว่า-execชิ้นส่วนทำงานอย่างไร เครื่องหมายวงเล็บคือเครื่องหมายแบ็กสแลชและเครื่องหมายอัฒภาคคืออะไร มีกรณีการใช้งานอื่นสำหรับไวยากรณ์นั้นหรือไม่
53 shell  find 

3
การใช้รูปแบบ OR ในสัญลักษณ์ตัวแทนเชลล์
เนื้อหาของ dir ของฉันคือ $ ls -lrt total 0 -rw-r--r-- 1 user1 admin 19 Oct 8 12:31 night.txt -rw-r--r-- 1 user1 admin 19 Oct 8 12:31 noon.txt -rw-r--r-- 1 user1 admin 38 Oct 8 12:31 day.txt ฉันต้องการแสดงรายละเอียดของไฟล์ที่มีคำในชื่อไฟล์ตามที่ระบุ ตัวอย่าง: $ ls -lrt *day|night* ls: *day: No such file or directory bash: night.txt: …
52 bash  shell  zsh  ls  wildcards 

14
วิธีที่ง่ายที่สุดในการค้นหาพอร์ตในเครื่องที่ไม่ได้ใช้คืออะไร
วิธีที่ง่ายที่สุดในการค้นหาพอร์ตในเครื่องที่ไม่ได้ใช้คืออะไร ขณะนี้ฉันกำลังใช้บางสิ่งที่คล้ายกับสิ่งนี้: port=$RANDOM quit=0 while [ "$quit" -ne 1 ]; do netstat -a | grep $port >> /dev/null if [ $? -gt 0 ]; then quit=1 else port=`expr $port + 1` fi done รู้สึกถึงวงเวียนอย่างสุดขีดดังนั้นฉันจึงสงสัยว่าจะมีเส้นทางที่ง่ายขึ้นเช่นตัวในที่ฉันพลาดไปหรือเปล่า

5
อะไรคือความแตกต่างพื้นฐานระหว่างหอยหลัก * NIX? [ปิด]
อะไรคือความแตกต่างพื้นฐานระหว่างเชลล์หลัก * NIX และสถานการณ์ใดที่อาจพร้อมท์ให้คุณใช้อีกอันหนึ่ง? ฉันเข้าใจว่าบางอย่างอาจลงมาตามความต้องการของผู้ใช้ แต่ฉันเคยใช้ bash และฉันสนใจที่จะได้ยินว่าเชลล์อีกอันมีประโยชน์หรือไม่ นอกจากนี้จะมีผลกระทบกับเชลล์สคริปต์ที่ผู้ใช้เขียนเมื่อทำงานภายใต้เชลล์หนึ่งหรืออีกเชลล์หรือเป็นเพียงเรื่องของการเปลี่ยนเชลล์ที่ด้านบนของไฟล์หรือไม่? สัญชาตญาณของฉันบอกว่ามันไม่ง่ายเลย
52 shell 

4
เขียน Python stdout เป็นไฟล์ทันที
เมื่อพยายามเขียน stdout จากสคริปต์ Python ไปยังไฟล์ข้อความ ( python script.py > log) ไฟล์ข้อความจะถูกสร้างขึ้นเมื่อคำสั่งเริ่มทำงาน แต่เนื้อหาจริงจะไม่ถูกเขียนจนกว่าสคริปต์ Python จะเสร็จสิ้น ตัวอย่างเช่น: script.py: import time for i in range(10): print('bla') time.sleep(5) พิมพ์ไปยัง stdout ทุก 5 วินาทีเมื่อเรียกด้วยpython script.pyแต่เมื่อฉันโทรpython script.py > logขนาดของไฟล์บันทึกจะเป็นศูนย์จนกระทั่งสคริปต์เสร็จสิ้น เป็นไปได้หรือไม่ที่จะเขียนลงในไฟล์บันทึกโดยตรงเช่นคุณสามารถติดตามความคืบหน้าของสคริปต์ (เช่นใช้tail)? แก้ไขมันปรากฎว่าpython -u script.pyเป็นการหลอกลวงฉันไม่รู้เกี่ยวกับบัฟเฟอร์ของ stdout
51 shell  python  stdout 

5
ฉันจะลบไดเรกทอรีย่อยทั้งหมดออกจากภายในไดเรกทอรีได้อย่างไร
คำถามนี้เป็นเฟสที่สองของคำถามแรกที่ฉันโพสต์ที่นี่ ฉันมีไดเรกทอรีที่มีกลุ่มของไดเรกทอรีย่อยไฟล์. zip และไฟล์สุ่มอื่น ๆ ที่ไม่อยู่ในไดเรกทอรีย่อย ฉันต้องการสคริปต์บรรทัดคำสั่งเพื่อลบไดเรกทอรีย่อยทั้งหมดออกจากภายในไดเรกทอรีหลัก แต่เก็บไฟล์ zip และไฟล์ทั้งหมดที่ไม่ได้อยู่ในไดเรกทอรีย่อยใด ๆ ไดเรกทอรีย่อยทั้งหมดมีเนื้อหาดังนั้นฉันเชื่อว่าฉันต้องบังคับให้ลบด้วยคำสั่ง -f ดังนั้นโดยทั่วไปคำสั่งที่มีลักษณะอยู่ในไดเรกทอรีหลัก (หรือไดเรกทอรีปัจจุบัน) จะลบโฟลเดอร์ทั้งหมดออกจากภายใน แต่จะเก็บเนื้อหาและไฟล์อื่น ๆ ทั้งหมดที่ไม่ใช่โฟลเดอร์หรืออยู่ในโฟลเดอร์ ฉันเข้าใจว่าการลบรายการออกจากบรรทัดคำสั่งจำเป็นต้องได้รับการดูแลเป็นพิเศษ แต่ฉันได้ใช้ความระมัดระวังที่จำเป็นทั้งหมดแล้วในการสำรองข้อมูลจากระยะไกล

2
ทำไม '.' ลิงค์ยากใน Unix?
ฉันเห็นคำอธิบายมากมายว่าเหตุใดลิงก์จึงนับเป็นไดเรกทอรีว่างในระบบปฏิบัติการ Unix ที่ใช้เป็น 2 แทนที่จะเป็น 1 พวกเขาทั้งหมดบอกว่าเป็นเพราะ '' ' ไดเรกทอรีซึ่งทุกไดเรกทอรีมีตัวชี้กลับไปเอง ฉันเข้าใจว่าทำไมการมีแนวคิด '.' มีประโยชน์สำหรับการระบุพา ธ ที่เกี่ยวข้อง แต่สิ่งที่ได้รับจากการใช้มันในระดับระบบไฟล์? ทำไมไม่เพียงแค่มีเชลล์หรือการเรียกระบบที่ใช้พา ธ รู้วิธีตีความมัน นั่นคือ '.. ' เป็นลิงก์จริงทำให้ฉันมีเหตุผลมากกว่านี้ - ระบบไฟล์จำเป็นต้องเก็บตัวชี้กลับไปยังไดเรกทอรีหลักเพื่อนำทางไปยังมัน แต่ฉันไม่เห็นว่าทำไม '.' การมีลิงค์จริงเป็นสิ่งจำเป็น ดูเหมือนว่ามันจะนำไปสู่กรณีพิเศษที่น่าเกลียดในการนำไปใช้ - คุณคิดว่าคุณสามารถเพิ่มพื้นที่ว่างที่ใช้โดย inodes ที่มีลิงค์นับน้อยกว่า 1 แต่ถ้าเป็นไดเรกทอรีคุณจะต้องตรวจสอบหา ลิงค์นับน้อยกว่า 2 ทำไมต้องมีความไม่ลงรอยกัน?

5
“ / bin / [” ทำงานอย่างไร
ฉันประหลาดใจเสมอที่ในโฟลเดอร์/binมี[โปรแกรม นี่คือสิ่งที่เรียกว่าเมื่อเรากำลังทำอะไรเช่น: if [ something ]? โดยการเรียก[โปรแกรมอย่างชัดเจนในเชลล์มันจะถามหาที่สอดคล้องกัน]และเมื่อฉันให้วงเล็บปิดมันดูเหมือนจะไม่ทำอะไรเลยไม่ว่าฉันจะแทรกอะไรระหว่างวงเล็บ จำเป็นต้องพูดทางปกติเกี่ยวกับการให้ความช่วยเหลือเกี่ยวกับโปรแกรมไม่ทำงานเช่นค่าman [มิได้[ --helpงาน
50 shell  test 

3
ฉันจะเปิดเซสชัน bash ที่ไม่ระบุตัวตนได้อย่างไร
มันเป็นไปได้ที่จะเปิดเซสชั่นไม่ระบุตัวตนในbash? ตัวอย่างเช่นเมื่อเราต้องป้อนรหัสผ่านในคำสั่งและไม่ต้องการbashเพิ่มลงในประวัติ

5
วิธีการส่งออกของคำสั่งหนึ่งเป็นอาร์กิวเมนต์บรรทัดคำสั่งไปยังอีก?
ดังนั้นฉันมีสคริปต์ที่เมื่อให้สองที่อยู่มันจะค้นหาลิงก์ HTML สองอัน: echo "http://maps.google.be/maps?saddr\=$1\&daddr\=$2" | sed 's/ /%/g' ฉันต้องการที่จะส่งข้อมูลนี้ให้แล้วบันทึกการส่งออกในไฟล์ที่เรียกว่าwget temp.htmlฉันลองสิ่งนี้ แต่มันไม่ทำงาน มีใครช่วยอธิบายสาเหตุและ / หรือให้ทางแก้ปัญหาแก่ฉันได้ไหม #!/bin/bash url = echo "http://maps.google.be/maps?saddr\=$1\&daddr\=$2" | sed 's/ /%/g' wget $url

5
ฉันจะออกจากสคริปต์ในคำสั่งแบบมีเงื่อนไขได้อย่างไร
ฉันกำลังเขียนสคริปต์ทุบตีที่ฉันต้องการออกหากผู้ใช้ไม่ได้รูท เงื่อนไขทำงานได้ดี แต่สคริปต์ไม่ออก [[ `id -u` == 0 ]] || (echo "Must be root to run script"; exit) ฉันลองใช้&&แทนที่จะใช้;แต่ไม่ได้ผล

3
การปิดไฟล์ descriptor,> & - vs <& -
ในการกวดวิชาทุบตีฉันอ่านมันบอกว่าถ้าคุณเปิดไฟล์อธิบายสำหรับการอ่านคือ exec 3&lt; echolist จากนั้นคุณต้องปิดมันแบบนี้ exec 3&lt;&amp;- อย่างไรก็ตามหากคุณเปิดไฟล์ descriptor เพื่อทำการเขียนจะต้องปิดดังนี้: exec 3&gt;&amp;- แต่เมื่อฉันดูบนอินเทอร์เน็ตฉันเห็นผู้คนกำลังเปิดไฟล์แล้วปิดด้วย: exec 3&gt;&amp;- หมายเหตุ:exec 3&lt;&amp;1เมื่อตามกวดวิชาที่พวกเขาควรจะใช้ ดังนั้นคำถามของฉันคือตัวอธิบายไฟล์ทั้งหมดสามารถปิดได้โดยexec n&gt;&amp;-ที่ n คือหมายเลขตัวอธิบายไฟล์หรือไม่ ไม่ว่าจะเปิดอ่านหนังสือเขียนหรือทั้งสองอย่าง

3
วิธีการส่งออกข้อความไปยังหน้าจอและไฟล์ภายในเชลล์สคริปต์?
ขณะนี้ฉันมีเชลล์สคริปต์ที่บันทึกข้อความไปยังไฟล์บันทึกเช่นนี้: log_file="/some/dir/log_file.log" echo "some text" &gt;&gt; $log_file do_some_command echo "more text" &gt;&gt; $log_file do_other_command เมื่อเรียกใช้งานสคริปต์นี้ไม่มีผลลัพธ์ไปที่หน้าจอและเนื่องจากฉันกำลังเชื่อมต่อกับเซิร์ฟเวอร์ผ่าน putty ฉันต้องเปิดการเชื่อมต่ออื่นและทำ "tail -f log_file_path.log" เนื่องจากฉันไม่สามารถยุติการทำงานได้ สคริปต์และฉันต้องการที่จะเห็นผลลัพธ์ในเวลาจริง เห็นได้ชัดว่าสิ่งที่ฉันต้องการคือข้อความที่พิมพ์บนหน้าจอและเป็นไฟล์ แต่ฉันต้องการที่จะทำในบรรทัดเดียวไม่ใช่สองบรรทัดหนึ่งในนั้นไม่มีการเปลี่ยนเส้นทางไปยังไฟล์ ทำอย่างไรจึงจะได้สิ่งนี้?

2
Bash: วิธีอ่านทีละหนึ่งบรรทัดจากเอาต์พุตของคำสั่ง?
while loopฉันพยายามที่จะอ่านผลลัพธ์ของคำสั่งในทุบตีใช้ที่ while read -r line do echo "$line" done &lt;&lt;&lt; $(find . -type f) ผลลัพธ์ที่ฉันได้รับ ranveer@ranveer:~/tmp$ bash test.sh ./test.py ./test1.py ./out1 ./test.sh ./out ./out2 ./hello ranveer@ranveer:~/tmp$ หลังจากนี้ฉันก็ลอง $(find . -type f) | while read -r line do echo "$line" done test.sh: line 5: ./test.py: Permission deniedแต่มันก็สร้างข้อผิดพลาด ดังนั้นฉันจะอ่านทีละบรรทัดได้อย่างไรเพราะฉันคิดว่าขณะนี้มันกำลังซัดทั้งบรรทัดในครั้งเดียว เอาต์พุตที่ต้องการ: ./test.py …
49 bash  shell  find  pipe 

1
อะไรคือความแตกต่างระหว่างเครื่องหมายคำพูด“ …”, '…', $ '…' และ $“ …”?
บางครั้งผมเห็นสคริปต์ใช้ทั้งหมดของวิธีการที่แตกต่างกันเหล่านี้อ้างข้อความบางส่วน: "...", '...', และ$'...' $"..."เหตุใดจึงมีการใช้เครื่องหมายคำพูดต่าง ๆ มากมาย? พวกเขามีพฤติกรรมที่แตกต่างหรือส่งผลกระทบต่อสิ่งที่ฉันสามารถทำได้ภายในพวกเขา?

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