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

คำถามเฉพาะของ Bourne อีกครั้งของเชลล์ใน GNU เมื่อเทียบกับเชลล์ Bourne / POSIX อื่น ๆ สำหรับคำถามเกี่ยวกับเชลล์ Unix โดยทั่วไปให้ใช้ / เชลล์แท็กแทน

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 มีวิธีการทำเช่นนี้?

4
สคริปต์ทุบตีที่ฆ่ากระบวนการโดยอัตโนมัติเมื่อการใช้งาน CPU / หน่วยความจำสูงเกินไป
ฉันได้สร้างสคริปต์ที่ฆ่ากระบวนการหากใช้งาน CPU และ / หรือหน่วยความจำถึง 80% มันสร้างรายการของกระบวนการที่ถูกฆ่าเมื่อเกิดเหตุการณ์นี้ขึ้น ฉันจะปรับปรุงอะไรได้บ้าง while [ 1 ]; do echo echo checking for run-away process ... CPU_USAGE=$(uptime | cut -d"," -f4 | cut -d":" -f2 | cut -d" " -f2 | sed -e "s/\.//g") CPU_USAGE_THRESHOLD=800 PROCESS=$(ps aux r) TOPPROCESS=$(ps -eo pid -eo pcpu -eo command | …

4
คำนวณขนาดไฟล์เฉลี่ย
ฉันกำลังมองหาซับในที่สะดวกสำหรับการคำนวณขนาดไฟล์เฉลี่ยในไดเรกทอรี สิ่งที่ฉันต้องการคือ: ขนาดของไฟล์ทั้งหมด / จำนวนไฟล์ในไดเรกทอรี

4
Bash: การจับภาพ / ใช้บรรทัดสุดท้าย (หรือ Nth) ใน stdout
สอบถาม ฉันใช้ Bash เมื่อฉันค้นหาไฟล์บ่อยครั้งที่ฉันจะทำสิ่งต่อไปนี้: find -name stackexchange.hs และผลลัพธ์มักจะมีลักษณะดังนี้: /youre/the/man/now/dog/stackexchange.hs /you/are/no/longer/the/dog/dog/stackexchange.hs /this/is/the/file/i/want/stackexchange.hs จากนั้นฉันจะทำอย่างใดอย่างหนึ่งต่อไปนี้: ตัวเลือกที่ 1: เปิดรายการสุดท้ายในรายการผลลัพธ์ในกลุ่ม ตัวเลือกที่ 2: เปิดรายการชับในรายการผลลัพธ์ในกลุ่ม ปัจจุบันฉันตัดและวางด้วยเมาส์ ซึ่งนำมาสู่คำถามของฉัน: มีซับในหนึ่งเดียวที่ง่ายต่อการบรรลุตัวเลือกที่ 1 และ 2 หรือไม่? ทราบว่านี้เกิดขึ้นหลังจากที่findคำสั่ง มีวิธีจับ N-line จาก stdout ใน bash vector / array หรือไม่? การใช้งานในอุดมคติ $ find -name am_i_really_all_alone.txt ./borges/library/you_are_not_alone.txt ./borges/library/am_i_really_all_alone.txt $ vim (N) (ไวยากรณ์และความหมายอาจแตกต่างกัน แต่คุณจะได้รับคะแนน) Similaria ดูเหมือนจะมีคำถามที่คล้ายกันหลายอย่าง …

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

4
เหตุใดฉันจึงไม่สามารถฆ่าการหมดเวลาที่เรียกจากสคริปต์ Bash ด้วยการกดแป้นได้
[แก้ไข: นี่คล้ายกับคำถามอื่น ๆ ที่ถามว่าจะฆ่ากระบวนการที่เกิดมาทั้งหมดได้อย่างไร - คำตอบทั้งหมดดูเหมือนจะใช้ pkill ดังนั้นหลักของคำถามของฉันอาจเป็น: มีวิธีการเผยแพร่ Ctrl-C / Z ไปยังกระบวนการทั้งหมดที่เกิดจากสคริปต์หรือไม่?] เมื่อเรียกใช้ SoX recด้วยtimeoutคำสั่งจาก coreutils (กล่าวถึงที่นี่ ) ดูเหมือนจะไม่มีทางที่จะฆ่ามันด้วยการกดแป้นเมื่อมีการเรียกใช้จากภายในสคริปต์ Bash ตัวอย่าง: timeout 10 rec test.wav ... สามารถถูกฆ่าด้วยCtrl+ CหรือCtrl+ Zจากการทุบตี แต่ไม่ใช่เมื่อมันถูกเรียกจากภายในสคริปต์ timeout 10 ping nowhere ... สามารถถูกฆ่าด้วยCtrl+ CหรือCtrl+ Zจาก bash และด้วยCtrl+ Zเมื่อมันถูกเรียกใช้จากภายในสคริปต์ ฉันสามารถค้นหารหัสกระบวนการและฆ่าด้วยวิธีนั้น แต่ทำไมฉันไม่สามารถใช้การกดแป้นพิมพ์มาตรฐาน และมีวิธีการจัดโครงสร้างสคริปต์ของฉันเพื่อให้ฉันสามารถ?

2
สร้างสคริปต์เติมเต็ม bash ให้กับเส้นทางเติมข้อความอัตโนมัติหลังจากเครื่องหมายเท่ากับ?
ฉันต้องการที่จะสร้างสคริปต์ทุบตีเสร็จสิ้นซึ่งตระหนักถึงข้อโต้แย้งของรูปแบบและ--arg--some-arg=file หลังจากอ่านบทช่วยสอนนี้และตัวอย่างบางส่วน/usr/share/bash_completion/completions/แล้วฉันได้เขียนสคริปต์ต่อไปนี้ (เพื่อประหยัดเวลาในการพิมพ์ค่าสถานะด้วย Chromium): _chromium() { local cur prev opts COMPREPLY=() cur="${COMP_WORDS[COMP_CWORD]}" prev="${COMP_WORDS[COMP_CWORD-1]}" # Some interesting options opts=" --disable-web-security --easy-off-store-extension-install --incognito --load-extension= --pack-extension= --pack-extension-key= --user-data-dir= " # Handle --xxxxxx=file if [[ ${cur} == "--"*"=" ]] ; then # Removed failures (is my logic OK?) return 0 fi # Handle other …

2
อ่านประวัติ
ฉันจะสร้างreadประวัติการสนับสนุนคำสั่งbuiltin ได้อย่างไรโดยการกดปุ่มขึ้น / ลงเพื่อวนรอบพวกเขา ฉันพยายามจับเมื่อคุณกดปุ่ม up แต่ดูเหมือนจะไม่ทำงานกับread: read -p '> ' -n 3 foo echo echo -n "$foo" | hexdump การกดปุ่มลูกศรดูเหมือนว่าจะใช้งานได้และฉันสามารถตรวจจับได้โดยใช้สิ่งนี้ แต่ถ้าฉันกดaa↑มันจะล้มเหลวเนื่องจากมันจะอ่านตัวอักษรแรกของตัวระบุของลูกศรขึ้นเท่านั้นในขณะที่ตัวที่สามจำเป็นต้องแยกลูกศรที่แตกต่างกัน กุญแจ

5
อ่านและยืนยันเชลล์สคริปต์ก่อนทำการไพพ์จาก curl ถึง sh (curl -s [url] | sh)
เมื่อใดก็ตามที่ฉันต้องเรียกใช้งานเชลล์สคริปต์จากเว็บcurl -s [url] | shฉันจะเปิดurlในเว็บเบราว์เซอร์ก่อนเพื่อให้แน่ใจว่าสคริปต์นั้นไม่เป็นอันตรายและปลอดภัยในการทำงาน ฉันจำได้ว่าเห็นเคล็ดลับบรรทัดคำสั่งที่ทำให้สามารถอ่านสคริปต์จากบรรทัดคำสั่งแล้วยืนยันการทำงานหลังจากอ่านสคริปต์ ถ้าฉันจำได้ถูกต้องมันดูเหมือนว่าcurl -s [url] | something...here | shและไม่ต้องการติดตั้งซอฟต์แวร์ใด ๆ ไม่มีใครรู้เคล็ดลับนี้

2
สอง / etc / hosts ที่แตกต่างกันขึ้นอยู่กับเวลา
ฉันกำลังพยายามสร้างชุดการเพิ่มผลผลิตสำหรับตัวฉันเอง เป้าหมายแรกของฉันคือการบล็อก Facebook, Gmail และ Stackexchange จาก 0900 ถึง 1600 ณ ตอนนี้ฉันได้แก้ไขของฉัน/etc/hostsและเพิ่ม 0.0.0.0 www.facebook.com และที่คล้ายกันสำหรับ gmail และ stackexchange แต่ฉันสับสนเล็กน้อยเกี่ยวกับวิธีรวมระยะเวลาการบล็อกในสคริปต์ของฉัน สิ่งที่ฉันคิดว่ามี 2 ไฟล์ที่แตกต่างกัน (hosts_allow, hosts_block) จากนั้นcp hosts_allow hostsหรือcp hosts_block hostsขึ้นอยู่กับเวลา แต่สิ่งนี้จะต้องใส่วนซ้ำไม่สิ้นสุดหรือบางสิ่งที่ฉันไม่แน่ใจว่าเป็นวิธีที่ดีที่สุดในการเข้าถึงปัญหา เบาะแสใด ๆ
11 bash  hosts 

2
พฤติกรรมแปลก ๆ ใน $ (dirname `readlink -f $ 0`)
เมื่อฉันเรียกใช้สิ่งต่อไปนี้ในฐานะผู้ใช้ทั่วไปทุกอย่างใช้ได้ดี: $(dirname `readlink -f $0`) แต่หลังจากฉันเปลี่ยนเป็นรูทแล้วเกิดข้อผิดพลาดต่อไปนี้: readlink: invalid option -- 'b' Try `readlink --help' for more information. dirname: missing operand Try `dirname --help' for more information. ความคิดใด ๆ ฉันลอง Fedora 16 และ Amazon EC2 ในพื้นที่ทั้งคู่กำลังใช้เชลล์ bash แก้ไขสำหรับภาพประกอบ ขออภัยที่ฉันไม่ได้อธิบายปัญหาเพิ่มเติมที่นี่ นี่คือสถานการณ์: ใช้บัญชีผู้ใช้ปกติ: $ pwd /home/myuser $ export MY_DIR=$(dirname `readlink -f $0`) $ …
11 bash 

3
สองคำสั่งหนึ่งไปป์ไลน์
ฉันต้องการคำสั่งสองคำสั่งนี้เพื่อเป็นหนึ่ง (ดังนั้นฉันสามารถไพพ์เพิ่มเติมได้): dig +nottlid -t any bix.hu | egrep -v "^;;|^;|^$" | sort dig +nottlid -t any www.bix.hu | egrep -v "^;;|^;|^$" | sort ฉันหมายถึงฉันต้องการผลลัพธ์ของสองคำสั่งเหล่านี้ในหนึ่งท่อ: $ dig +nottlid -t any bix.hu | egrep -v "^;;|^;|^$" | sort bix.hu. IN A 193.239.149.1 bix.hu. IN MX 10 deneb.iszt.hu. bix.hu. IN NS ns.iszt.hu. …
11 bash  dns 

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