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

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

1
ล้างบรรทัดพรอมต์เก่าในทุบตีเพื่อประหยัดพื้นที่เลื่อน
ชุดรูปแบบเทอร์มินัลของฉันเคยเป็นเช่นนี้ แต่ฉันคิดว่าพรอมต์เสียพื้นที่มากมาย และต่อมาฉันก็มีความคิดว่าฉันสามารถทำความสะอาดพรอมต์ทุกครั้งที่ฉันมีคำสั่ง ฉันใช้ทุบตีวิธีหนึ่งคือใช้preexec_invoke_execฟังก์ชั่น ฉันใช้คำสั่งต่อไปนี้เพื่อทำความสะอาดตัวอักษรพรอมต์ล่าสุด: echo -ne "\033[1A\033[K\033[1A\033[K\033[31;1m$ \033[0m" เพื่อให้เครื่องนั้นสะอาดมากเช่นนี้ แต่ตอนนี้ปัญหาของฉันจะมีปัญหาถ้าผมต้องการที่จะใช้คำสั่งหลายในหนึ่งบรรทัดfor i in ...กล่าวว่าเมื่อผมใช้ นี่คือเวอร์ชั่นเต็มของฟังก์ชั่นใน. bashrc ของฉัน preexec () { echo -ne "\033[1A\033[K\033[1A\033[K\033[31;1m$ \033[0m"; echo -n "$1"; echo -ne " \033[37;2m["; echo -n "$2"; echo -ne "]\033[0m\n"; } preexec_invoke_exec () { [ -n "$COMP_LINE" ] && return # do nothing …
11 bash  shell  terminal  prompt 

2
ใบสั่งเอาท์พุทที่มีการทดแทนกระบวนการ
นี่คือสิ่งที่ฉันมักจะทำเพื่อเรียกใช้grepและwcบนไฟล์โดยไม่ต้องสแกนสองครั้ง <file.txt tee >(grep LITERAL) >(wc -l) >/dev/null อย่างไรก็ตามอัตราผลตอบแทนนี้ EXEC LITERAL 32 บางครั้งและ 32 EXEC LITERAL ในเวลาอื่น ๆ (เอาต์พุตจากgrepนำหน้าเอาต์พุตจากwcในอินสแตนซ์แรกและกลับกันในวินาที) ในขณะที่มีการเปลี่ยนเส้นทางและอธิบายไฟล์ { { <file.txt tee /dev/fd/3 | grep LITERAL >&4; } 3>&1 | wc -l ;} 4>&1 ฉันมักจะได้รับเสมอ EXEC LITERAL 32 ฉันชอบที่คำสั่งเอาท์พุทสามารถคาดเดาได้ แต่รับประกันด้วยแนวทางที่สองหรือไม่?

3
เปลี่ยนเส้นทางเอาต์พุตจากคำสั่งทั้งหมดไปยังไฟล์ไม่ใช่เพียงครั้งสุดท้าย
ฉันต้องการเพิ่มส่วนหัวในไฟล์ที่มี echo จากนั้นใช้คำสั่งเพื่อสร้างไฟล์ที่เหลือ หมายความว่าฉันจะใช้สองคำสั่งแยกกัน ฉันจะเขียนเอาต์พุตจากคำสั่งทั้งสองไปยังไฟล์ที่มีการเปลี่ยนเส้นทางได้อย่างไร ฉันพยายามแล้ว echo "header line" | cut -c 1-5 input_file > output_file echo "header line"; cut -c 1-5 input_file > output_file นี่จะเปลี่ยนเส้นทางเอาต์พุตจากคำสั่ง cut เท่านั้น คำสั่งต่อไปนี้ใช้งานได้ แต่รู้สึกเงอะงะ: echo "header line" > output_file; cut -c 1-5 input_file >> output_file วิธีที่ชาญฉลาดในการแก้ปัญหาของฉันคืออะไร?

5
วิธีการ "รวม" บรรทัดที่พิมพ์โดยหลาย ๆ โปรแกรมอย่างปลอดภัย?
สมมติว่าฉันต้องการรันหลาย ๆ โปรแกรมในแบบคู่ขนานและรวมเอาท์พุทของมันเข้ากับไพพ์เดียว: sh -c ' (echo qqq; echo qqq2; echo qqq3)& (echo www; echo www2; echo www3)& (echo eee; echo eee2; echo eee3)& wait; wait; wait' วิธีเชลล์นี้ใช้งานได้ดีสำหรับกรณีง่าย ๆ นี้ แต่ฉันคาดหวังว่ามันจะล้มเหลวหากโปรแกรมส่งออกบรรทัดมากขึ้นและนานขึ้นในลักษณะบัฟเฟอร์เช่นนี้ (สร้างขึ้น): qqq qqwww q2 qqq3www2 wwweee3 eee2 eee3 หนึ่งในวิธีแก้ปัญหาที่ฉันบอกใบ้ให้ใช้คือtail -f: tail -n +0 -q -f <(echo qqq; echo qqq2; …

2
คุณสมบัติเชลล์ชื่ออะไร> (tee copyError.txt> & 2) `?
ฉันต้องเข้าสู่ระบบ stdout และ stderr เพื่อ logfiles แต่เพียงแสดงข้อความผิดพลาดบนหน้าจอ ฉันสามารถทำได้ด้วย: cp -rpv a/* b 1> copyLog.txt 2> >(tee copyError.txt >&2) ซึ่งฉันพบที่ไหนสักแห่งในเว็บ ฉันแค่อยากรู้ว่า>(tee copyError.txt >&2)สิ่งนี้เรียกว่าอะไร? ฉันทำไม่ได้เพราะ Google ไม่สนใจอักขระเช่นวงเล็บเหลี่ยมและวงเล็บ ..
11 bash  shell 

2
`kill -p` ใช้ได้ผลจริงหรือ
ในหน้า man ของkillมันเขียนดังต่อไปนี้ สรุป kill [ -s signal | -p ] [ -a ] [ -- ] pid ... kill -l [ signal ] -p Specify that kill should only print the process id (pid) of the named processes, and not send any signals. แต่เมื่อฉันลองทั้งสองครั้งทั้ง RH และ RHEL คำสั่งkill -s …

5
เป็นไปได้ที่จะได้รับ SMS / ข้อความแจ้งเตือนเมื่อกระบวนการสิ้นสุดลงหรือถูกฆ่า?
มีสคริปต์ที่จะส่งอีเมลเมื่อกระบวนการเซิร์ฟเวอร์เสร็จสิ้น อย่างไรก็ตามฉันไม่ต้องการตรวจสอบอีเมลของฉันบ่อย ๆ เพียงเพื่อดูว่างานเสร็จหรือไม่ ดังนั้นฉันต้องการรับข้อความ SMS คำถามของฉันคล้ายกับคำถามนี้เพียงแค่แลกเปลี่ยน SMS กับ "อีเมล" ที่เกิดขึ้นทั้งหมด: มีโปรแกรมที่สามารถส่งอีเมลแจ้งเตือนเมื่อกระบวนการเสร็จสิ้นหรือไม่? คุณนึกถึงวิธีแก้ปัญหา / แอพ / สคริปต์ / อะไรก็ตามที่จะช่วยให้ส่ง SMS เมื่องานเสร็จ (หรือสิ้นสุดก่อนกำหนด)

2
ยกมาเทียบกับการขยายตัวสตริงที่ไม่ได้ยกมา
for i in $(xrandr); do echo "$i" ; done for i in "$(xrandr)"; do echo "$i"; done for i in "$(xrandr)"; do echo $i; done ฉันเข้าใจว่าทำไม 1 แตกต่างจาก 2 แต่เหตุใด 3 จึงให้ผลลัพธ์ที่แตกต่างจาก 2 โปรดอธิบายผลลัพธ์ด้วย คำพูดทำงานอย่างไรกับการขึ้นบรรทัดใหม่

10
เป็นวิธีการตรวจสอบว่ากระบวนการกำลังทำงานอยู่ในพื้นหลัง (และข้ามการดำเนินการใหม่ตามนั้นหรือไม่)
ฉันสามารถสร้างบรรทัดคำสั่ง bash ที่รันเฉพาะคำสั่งบางอย่างได้หรือไม่หากกระบวนการยังไม่ได้ทำงาน (อยู่เบื้องหลัง) ฉันจะตรวจสอบได้อย่างไร * หากคำสั่งทำงานอยู่แล้ว (ดังนั้นฉันสามารถเพิ่มคำสั่งถัดไปด้วย&&ในระหว่างพวกเขาดังนั้นคนต่อไปจะดำเนินการเฉพาะถ้าคนแรกเป็นจริง) *: ทดสอบกำหนดค้นหาค้นพบ
11 bash  shell  process 

2
รอให้หน้าต่าง X ปรากฏขึ้น / หายไป (อย่างมีสติ)
ภายในเชลล์สคริปต์ฉันต้องรอหน้าต่างที่มีสตริงชื่อปรากฏขึ้นทำการกระทำบางอย่างแล้วรอให้มันหายไปและดำเนินการอื่น ๆ เมื่อวานนี้ฉันมีรหัสง่ายๆนี้ ปัญหาคือมันไม่สามารถใส่ดิสก์ในสถานะประหยัดพลังงานในขณะที่สคริปต์ยังคงทำงานและอาจใช้เวลาหลายชั่วโมง: while :; do until wmctrl -l | grep -q "$string"; do # until sleep 0.5 done : do action 1 while wmctrl -l | grep -q "$string"; do # while sleep 0.5 done : do action 2 done เนื่องจากฉันตัดสินใจว่ารหัสที่กล่าวมานั้นกำลังตื่นขึ้นมาอย่างบ้าคลั่งฉันจึงอ่านเอกสารประกอบของเครื่องมือบรรทัดคำสั่งไม่กี่คำและตัดสินใจที่xdotoolจะรอให้หน้าต่างปรากฏขึ้นและxpropเพื่อพิจารณาเมื่อหน้าต่างหายไป while :; do # we use `until' …
11 bash  shell  python  window 

2
ขยายเชลล์ย่อยก่อนเรียกใช้งานหรือไม่
ฉันมักเรียกใช้คำสั่งโดยใช้ subshells และบางครั้งต้องการที่จะขยาย subshells ก่อนที่ฉันจะทำงานบางอย่าง .. วิธีนี้ฉันสามารถตรวจสอบสิ่งที่ฉันทำและอาจแก้ไขสิ่งที่เกิดขึ้นเช่นกัน ตัวอย่างเช่นฉันจะขยายบรรทัดคำสั่งต่อไปนี้ก่อนที่จะเรียกใช้เพื่อให้ฉันสามารถแก้ไขผลลัพธ์ของ subshell ได้อย่างไร เช่น $ find -name "test.txt" /tmp/test.txt $ mv $(!!) /tmp/new.txt ฉันต้องการเห็น subshell ขยายก่อนที่ฉันเรียกใช้คำสั่งเช่น: $ mv /tmp/test.txt /tmp/new.txt มีวิธีการทำเช่นนี้?

1
ความสำคัญของ dot ในคำสั่ง bash คืออะไรและแตกต่างจากเครื่องหมายดอกจันอย่างไร
ฉันพยายามที่จะเข้าใจความสำคัญของจุดในการทุบตีและวิธีการที่แตกต่างจากดอกจัน ใครบางคนช่วยอธิบายรายละเอียดได้ไหม? ตัวอย่างเช่นอะไรคือความแตกต่างระหว่างcp -ar /foo/. /foo2/และcp -pr /foo/* /foo2/

7
วิธีการใช้ตัวแปรเป็นส่วนหนึ่งของชื่ออาร์เรย์
ฉันมีสองอาร์เรย์ arrayA=(1 2 3) arrayB=(a b c) if elseและฉันต้องการที่จะพิมพ์ออกหนึ่งของพวกเขาโดยใช้อาร์กิวเมนต์บรรทัดคำสั่งคือโดยไม่ต้องมี ฉันลองใช้รูปแบบของไวยากรณ์ไม่สำเร็จ ฉันต้องการทำสิ่งนี้: ARG="$1" echo ${array${ARG}[@]} แต่ฉันได้รับข้อผิดพลาด "การแทนที่ไม่ดี" ฉันจะบรรลุสิ่งนี้ได้อย่างไร
11 bash  shell 

2
ปัญหาในสคริปต์ด้วยช่องว่างในชื่อไฟล์
ฉันมีสคริปต์ที่ scp เป็นไฟล์จากโฮสต์ระยะไกลกลับสู่ท้องถิ่น บางครั้งชื่อไฟล์มีช่องว่าง scp ไม่ชอบช่องว่างในชื่อไฟล์ ด้วยเหตุผลบางประการความพยายามของฉันในการจัดการช่องว่างไม่ได้ส่งผลให้เส้นทาง scp ที่ถูกต้อง รหัส: PATH=/var/root/Documents/MyFile OG-v1.2.3.pkg scp $PATH Me@10.1.10.33:/Users/Me/Desktop ผลลัพธ์ใน Cannot find directory: var/root/Documents/MyFile Cannot find directory: OG-v1.2.3.pkg การใส่ PATH ในเครื่องหมายคำพูด"$PATH"ทำให้เกิดข้อผิดพลาดเดียวกัน การสลับช่องว่างสำหรับช่องว่างที่หลบหนียังไม่ทำงานแม้ว่าเท่าที่ฉันสามารถบอกได้ก็ควรจะ: ESC_PATH=${PATH/' '/'\ '} แม้ว่าการพิมพ์พา ธ ที่หลบหนีแสดงว่าการแก้ไขทำงานได้: echo $ESC_PATH > /var/root/Documents/MyFile\ OG-v1.2.3.pkg

2
การทำนายบรรทัดคำสั่ง
ฉันได้พบเอกสารที่น่าสนใจ: การคาดการณ์บรรทัดคำสั่ง UNIXเกี่ยวกับการคาดการณ์บรรทัดคำสั่ง (จากกิจกรรมที่ผ่านมาของผู้ใช้) และฉันสงสัยว่ามีการใช้งานจริงของสิ่งนั้นหรือไม่?

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