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

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


3
“ กับดัก…ออกจากระยะเวลา” จำเป็นจริงๆหรือ?
ตัวอย่างมากมายสำหรับtrapใช้trap ... INT TERM EXITสำหรับงานการล้างข้อมูล แต่มันจำเป็นจริงๆหรือไม่ที่จะแสดงรายการทั้งสาม sigspecs? คู่มือบอกว่า: หาก SIGNAL_SPEC เป็น EXIT (0) ARG จะถูกดำเนินการเมื่อออกจากเปลือก ซึ่งผมเชื่อว่าไม่ว่าจะใช้สคริปต์เสร็จได้ตามปกติหรือมันเสร็จเพราะมันได้รับหรือSIGINT SIGTERMการทดลองยืนยันความเชื่อของฉันด้วย: $ cat ./trap-exit #!/bin/bash trap 'echo TRAP' EXIT sleep 3 $ ./trap-exit & sleep 1; kill -INT %1 [1] 759 TRAP [1]+ Interrupt ./trap-exit $ ./trap-exit & sleep 1; kill -TERM %1 [1] …
63 bash  shell  signals  trap 


5
ทำไม SIGINT ถึงไม่แพร่กระจายไปยังกระบวนการลูกเมื่อส่งไปยังกระบวนการแม่
ด้วยกระบวนการเชลล์ (เช่นsh) และกระบวนการลูก (เช่นcat) ฉันจะจำลองพฤติกรรมของCtrl+ Cโดยใช้ ID กระบวนการของเชลล์ได้อย่างไร นี่คือสิ่งที่ฉันได้ลอง: วิ่งshแล้วcat: [user@host ~]$ sh sh-4.3$ cat test test ส่งSIGINTไปcatจากสถานีอื่น: [user@host ~]$ kill -SIGINT $PID_OF_CAT cat รับสัญญาณและยกเลิก (ตามที่คาดไว้) ดูเหมือนว่าการส่งสัญญาณไปยังกระบวนการหลักนั้นไม่ทำงาน ทำไมสัญญาณไม่แพร่กระจายไปcatเมื่อถูกส่งไปยังกระบวนการแม่sh? สิ่งนี้ไม่ทำงาน: [user@host ~]$ kill -SIGINT $PID_OF_SH
62 shell  process  signals 

3
วิธีดาวน์โหลดไฟล์เก็บถาวรและแตกไฟล์โดยไม่บันทึกไฟล์ลงดิสก์
ฉันต้องการดาวน์โหลดและแยกไฟล์เก็บถาวรภายใต้ไดเรกทอรีที่กำหนด นี่คือวิธีที่ฉันทำไปแล้ว: wget http://downloads.mysql.com/source/dbt2-0.37.50.3.tar.gz tar zxf dbt2-0.37.50.3.tar.gz mv dbt2-0.37.50.3 dbt2 ฉันต้องการดาวน์โหลดและแตกไฟล์เก็บถาวรทันทีโดยไม่ต้องtar.gzเขียนลงดิสก์ ฉันคิดว่าสิ่งนี้เป็นไปได้โดยการส่งออกwgetไปยังtarและให้tarเป้าหมาย แต่ในทางปฏิบัติฉันไม่ทราบวิธีการรวมชิ้นส่วนเข้าด้วยกัน
62 shell  pipe  tar  wget 

5
ไม่สามารถเยื้อง heredoc เพื่อให้ตรงกับการเยื้องของการซ้อน
หากมี "ปัญหาโลกครั้งแรก" สำหรับการเขียนสคริปต์นี่จะเป็นเช่นนั้น ฉันมีรหัสต่อไปนี้ในสคริปต์ที่ฉันอัปเดต: if [ $diffLines -eq 1 ]; then dateLastChanged=$(stat --format '%y' /.bbdata | awk '{print $1" "$2}' | sed 's/\.[0-9]*//g') mailx -r "Systems and Operations <sysadmin@[redacted].edu>" -s "Warning Stale BB Data" jadavis6@[redacted].edu <<EOI Last Change: $dateLastChanged This is an automated warning of stale data for the UNC-G …

6
วิธีการตรวจสอบว่าทุบตีสามารถพิมพ์สี
ฉันต้องการทราบว่ามีวิธีใดบ้างที่จะตรวจสอบว่าโปรแกรมของฉันสามารถส่งออกเทอร์มินัลโดยใช้สีหรือไม่ การเรียกใช้คำสั่งเช่นlessและดูผลลัพธ์จากโปรแกรมที่เอาต์พุตโดยใช้สีเอาต์พุตจะแสดงผิดเช่น [ESC[0;32m0.052ESC[0m ESC[1;32m2,816.00 kbESC[0m] ขอบคุณ
62 shell  terminal  colors 

1
ทำไม nullglob ไม่ผิดนัด?
ในหอยส่วนใหญ่nullglobไม่ได้เป็นค่าเริ่มต้น ตัวอย่างเช่นถ้าคุณใช้คำสั่งนี้ ls * ในไดเรกทอรีว่างมันจะขยาย*glob ไปตามตัวอักษร*แทนที่จะเป็นรายการอาร์กิวเมนต์ว่าง มีวิธีในการเปลี่ยนพฤติกรรมดังกล่าวดังนั้น*ในไดเรกทอรีว่างจะส่งคืนรายการอาร์กิวเมนต์ว่างซึ่งจะดูง่ายขึ้น ดังนั้นมีเหตุผลทำไมnullglobถูกปิดใช้งานโดยค่าเริ่มต้น? ถ้าเป็นเช่นนั้นเหตุผลอะไร
61 shell  wildcards 

3
`kill -0` ทำอะไร
ฉันเพิ่งเจอสิ่งนี้ในเชลล์สคริปต์ if ! kill -0 $(cat /path/to/file.pid); then ... do something ... fi อะไรkill -0 ...ทำอย่างไร
61 shell  process  kill 

1
เปลี่ยนเส้นทางทั้ง stderr และ stdout เป็น / dev / null ด้วย / bin / sh
ฉันได้ลองทุกวิธีเพื่อเปลี่ยนเส้นทางทั้งไปstdoutและไม่ประสบความสำเร็จ ผมมีเกือบทั้งทุบตีชีวิตการทำงานของฉันที่ฉันไม่เคยมีปัญหานี้ด้วย แต่เป็นครั้งแรกใน BSD ฉันติดอยู่กับstderr/dev/null/bin/sh สิ่งที่ฉันได้ลอง: if ls ./python* 2> /dev/null; then echo found Python fi ... ซึ่งใช้งานได้; ถ้า Python ไม่มีอยู่มันจะปิดข้อความแสดงข้อผิดพลาดจาก ls อย่างไรก็ตามถ้าpython.tgzมีอยู่บรรทัดที่มีเอาต์พุตซึ่งมีลักษณะดังนี้: # ./test.sh ./python-2.7.3p1.tgz ฉันได้ลองแล้ว: if ls ./python* &> /dev/null; then echo found Python fi และ if ls ./python* 2>1 > /dev/null; then echo found Python fi และ …

1
คำสั่งนี้ถูกกฎหมายอย่างไร “> file1 <file2 cat”
สมมติว่าfile2มีอยู่แล้วคำสั่ง &gt; file1 &lt; file2 cat ดูเหมือนจะคัดลอกเนื้อหาของการfile2file1 แต่ฉันไม่เข้าใจโครงสร้างนี้ ฉันเข้าใจว่า "ไม่มีสิ่งใด" กำลังถูกนำไปสู่file1(สร้างหรือลบเนื้อหา) แล้วเนื้อหาของจะถูกนำไปยังfile2file1 เป็นเพราะเหตุใดcatหลังจากที่file2? จะทราบได้อย่างไรcat file2ว่าตัวถูกดำเนินการไม่ได้อยู่ในลำดับที่ถูกต้อง?

2
วิธีการวนลูปมากกว่าบรรทัดของไฟล์?
บอกว่าฉันมีไฟล์นี้: hello world hello world โปรแกรมนี้ #!/bin/bash for i in $(cat $1); do echo "tester: $i" done เอาท์พุท tester: hello tester: world tester: hello tester: world ฉันต้องการให้มีการวนforซ้ำในแต่ละบรรทัดโดยไม่สนใจ whitespaces แม้ว่าเช่นควรจะแทนที่สองบรรทัดสุดท้าย tester: hello world การใช้เครื่องหมายคำพูดfor i in "$(cat $1)";ส่งผลiให้มีการกำหนดไฟล์ทั้งหมดในครั้งเดียว ฉันควรเปลี่ยนอะไร

3
Shebang เริ่มต้นด้วย `// '?
ฉันสับสนเกี่ยวกับการติดตามสคริปต์ ( hello.go) //usr/bin/env go run $0 $@ ; exit package main import "fmt" func main() { fmt.Printf("hello, world\n") } มันสามารถดำเนินการ (บน MacOS X 10.9.5) $ chmod +x hello.go $ ./hello.go hello, world ฉันไม่เคยได้ยินเกี่ยวกับ shebang //มาก่อนเลย และมันก็ยังทำงานได้เมื่อฉันแทรกบรรทัดว่างที่ด้านบนของสคริปต์ เหตุใดสคริปต์นี้จึงทำงาน


6
เครื่องหมายวงเล็บในคณิตศาสตร์ expr: 3 * (2 + 1)
expr ดูเหมือนจะไม่ชอบวงเล็บ (ใช้ในคณิตศาสตร์เพื่อจัดลำดับความสำคัญผู้ประกอบการที่ชัดเจน): expr 3 * (2 + 1) bash: syntax error near unexpected token `(' วิธีแสดงโอเปอเรเตอร์ที่สำคัญในการทุบตี?

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