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

คำถามเกี่ยวกับเชลล์สคริปต์ไฟล์เรียกทำงานที่ตีความโดยเชลล์ (bash, zsh ฯลฯ )

4
ฉันจะรับสถิติ CPU ที่คล้ายกันจากเชลล์ได้อย่างไร?
ฉันพยายามที่จะได้รับการอ่านที่ถูกต้องของ CPU ที่ใช้ของฉัน (ร้อยละ) topจาก นี่คือคำสั่งที่ฉันใช้สำหรับทดสอบ: top -n1 | awk '/Cpu\(s\):/ {print $2}' ผลตอบแทนนี้: 10.7%us, ฉันต้องการข้อมูลชิ้นใดที่เหมาะสม อย่างไรก็ตามทุกครั้งที่ฉันรันคำสั่งฉันจะได้ผลลัพธ์เดียวกันแม้ว่าฉันจะใช้การโหลดที่แตกต่างกันในระบบของฉัน (และไม่พูดถึงhtopจะบอกว่าการใช้งานของฉันแตกต่างกัน) ดูเหมือนว่าเมื่อใดก็ตามที่ฉันเริ่มtopการใช้งาน CPU ของฉันเหมือนกัน หลังจากนั้นไม่กี่เฟรมก็ให้ค่าที่เหมาะสมกับฉัน ดูเหมือนว่าฉันจะไม่สามารถแยกเอาท์พุทของ Top ด้วยวิธีนี้ดังนั้นฉันกำลังมองหาแอปพลิเคชั่นที่น่าเชื่อถืออื่น ๆ ซึ่งจะให้การอ่านที่แม่นยำจากเชลล์ ฉันชอบที่htopจะให้การอ่านแบบคอร์ฉันได้อย่างไร ฉันพยายามiostatแล้วmpstatแต่พวกเขาดูเหมือนจะให้ค่าที่ไม่ถูกต้องและ "ช้าต่อการเปลี่ยนแปลง"
12 shell-script  cpu  top  htop 

2
วิธีสร้างไฟล์ภาพเปล่าจำนวนมาก?
สำหรับการทดสอบฉันต้องสร้างภาพ jpg-1700 (แม้แต่ที่ว่างเปล่า) อย่างรวดเร็วในขนาดที่กำหนด 1,000x706 ฉันสงสัยว่าเราสามารถทำได้ด้วยเชลล์สคริปต์หรือโปรแกรม (เช่น ImageMagick) ฉันหวังว่าพวกเขาเรียกว่าimg_0.jpg, img_1.jpg... มีคนรู้วิธีแก้ปัญหาง่าย ๆ ?

7
พิมพ์อาร์กิวเมนต์ของเชลล์ในลำดับย้อนกลับ
ฉันติดอยู่นิดหน่อย งานของฉันคือการพิมพ์อาร์กิวเมนต์ไปยังสคริปต์ของฉันในลำดับย้อนกลับยกเว้นที่สามและสี่ สิ่งที่ฉันมีคือรหัสนี้: #!/bin/bash i=$# for arg in "$@" do case $i in 3) ;; 4) ;; *) eval echo "$i. Parameter: \$$i";; esac i=`expr $i - 1` done ในขณะที่ฉันเกลียด eval (ทักทาย PHP) ฉันกำลังมองหาวิธีการแก้ปัญหาโดยไม่ได้ทำ แต่ฉันไม่สามารถหามันได้ ฉันจะกำหนดตำแหน่งของการโต้แย้งแบบไดนามิกได้อย่างไร PS: มันไม่ใช่การบ้านฉันกำลังเรียนรู้การทำข้อสอบดังนั้นฉันจึงพยายามแก้ข้อสอบเก่า

3
บัญชีเชลล์ฟรีปลอดภัยหรือไม่
ฉันพยายามระบุว่าบัญชี shell ที่ให้บริการโดยshellmix.com ปลอดภัยแค่ไหน ฉันไม่เคยใช้ตัวเอง แต่ต้องการแนะนำให้คนที่สนใจเรียนรู้การเขียนโปรแกรมเชลล์ พวกเขาปลอดภัยที่จะใช้เพื่อจุดประสงค์นี้หรือไม่? ฉันควรระวังอะไร

3
วิธีการแฮช md5 ส่งผลให้เชลล์
ฉันกำลังมองหาวิธีง่ายๆในการทำให้ผลลัพธ์md5sumเป็นคำสั่งอื่น บางสิ่งเช่นนี้ $echo -n 'test' | md5sum | ... ปัญหาของฉันคือmd5sumเอาต์พุตไม่เพียง แต่การแฮชของสตริงเท่านั้น แต่ยังเป็นไฮเปอร์ซึ่งแสดงว่าอินพุตมาจาก stdin ฉันตรวจสอบไฟล์ man และไม่พบการตั้งค่าสถานะใด ๆ เพื่อควบคุมเอาต์พุต

2
./executable: ไม่สามารถเรียกใช้ไฟล์ไบนารี
ฉันมีสคริปต์ที่ทำงานได้ดีเมื่อฉันส่งไฟล์ไปยังเซิร์ฟเวอร์เพื่อรันด้วยตัวเอง แต่มีปัญหาเมื่อฮัดสันซึ่งเป็นเซิร์ฟเวอร์รวมอย่างต่อเนื่องรันได้ ฉันกำลังทำการทดสอบอัตโนมัติบนระบบลินุกซ์ในตัว (เป้าหมาย) เป้าหมายเชื่อมต่อกับเซิร์ฟเวอร์ A (RHEL 5) ผ่านทางอนุกรมและดำเนินการผ่าน minicom เซิร์ฟเวอร์ B (FC 12) สร้างการทดสอบที่ทำงานบนเป้าหมายจริงและสามารถ ssh ไปที่เซิร์ฟเวอร์ A เซิร์ฟเวอร์ C (RH) โฮสต์ฮัดสันโดยเซิร์ฟเวอร์ B เป็นทาส ฉันได้เขียนสคริปต์ runcript (http://linux.die.net/man/1/runscript) เพื่อทำทุกอย่างที่จำเป็นในเป้าหมายจริง มันบูทอิมเมจติดตั้งไดเรกทอรีจากเซิร์ฟเวอร์ B และดำเนินการทดสอบ สคริปต์ทุบตีบนเซิร์ฟเวอร์ B จะเรียกใช้ minicom ด้วยสคริปต์ runcript พร้อมกับการดำเนินการร่วมกัน ฉันมีสคริปต์ทุบตีบนเซิร์ฟเวอร์ B ซึ่งใช้ ssh -t -t ServerA bashScript.sh เพื่อให้การทดสอบเหล่านั้นทำงานตามเป้าหมาย ฉันอยู่บนเซิร์ฟเวอร์ C ฉันสามารถรับการทดสอบเหล่านั้นที่ดำเนินการโดย …

3
จะทำให้ไพพ์ไลน์รอการสิ้นสุดไฟล์หรือหยุดหลังจากเกิดข้อผิดพลาดได้อย่างไร?
ฉันลองคำสั่งต่อไปนี้หลังจากดูวิดีโอนี้ใน shenanigans ไปป์ man -k . | dmenu -l 20 | awk '{print $1}' | xargs -r man -Tpdf | zathura - โดยทั่วไปจะพิมพ์รายการ manpages ไปที่ dmenu เพื่อให้ผู้ใช้เลือกหนึ่งรายการจากนั้นจะใช้ xargs เพื่อเรียกใช้man -Tpdf %(พิมพ์ไปยัง stdout PDF ของ manpage git จากอินพุต xargs) และส่ง pdf ไปยังโปรแกรมอ่าน pdf (zathura ) ปัญหาคือ (ตามที่คุณเห็นในวิดีโอ) ตัวอ่าน pdf เริ่มต้นก่อนที่ฉันจะเลือก manpage …

2
การแทนที่ตัวแปร Bash ของตัวแปรตามด้วยขีดล่าง
ตัวแปรBUILDNUMBERถูกตั้งค่าเป็น 230 ฉันคาดว่า230_จะพิมพ์สำหรับคำสั่งecho $BUILDNUMBER_แต่เอาต์พุตว่างเปล่าดังแสดงด้านล่าง # echo $BUILDNUMBER_ # echo $BUILDNUMBER 230

2
การใช้งาน set -u ไม่ทำงานอย่างที่คาดไว้
ฉันเรียนรู้วิธีใช้setตัวเลือกต่างๆ ในสคริปต์อย่างมีประสิทธิภาพและพบset -uว่าเหมาะสำหรับการออกจากสคริปต์หากตัวแปรไม่ได้รับการตั้งค่าอย่างเหมาะสม (เช่นการลบผู้ใช้) ตามหน้าmanset -uและset -eทำสิ่งต่อไปนี้ ... -e Exit immediately if a command exits with a non-zero status. -u Treat unset variables as an error when substituting. ฉันสร้างสคริปต์ทดสอบเพื่อทดสอบฟังก์ชันนี้ แต่ดูเหมือนว่าจะไม่ทำงานตามที่คาดไว้ บางทีใครบางคนสามารถอธิบายปัญหาของฉันกับฉันได้ดีกว่าและฉันกำลังตีความผิด ๆ อยู่ที่ไหน? สคริปต์ทดสอบอยู่ด้านล่าง ขอขอบคุณ. set -e set -u testing="This works" echo $? echo ${testing} testing2= echo $? echo ${testing2} …

1
“ wait &” (“ wait ampersand”) เป็นประโยชน์ (bash) shell / shell script สำนวนหรือเทคนิค?
ฉัน "ได้รับมรดก" เชลล์สคริปต์บางตัวสำหรับเครื่อง Linux ที่ใช้เชลล์ "bash" ของ GNU ในกรณีเฉพาะกรณีหนึ่งเครื่องจะรัน GNU bash รุ่น 2.0.5b หนึ่งในสคริปต์เหล่านั้นมีคำสั่งwait &("wait ampersand") ซึ่งเป็นส่วนหนึ่งของ "for line" ของforลูป ตั้งแต่แรกพบดูเหมือนว่าจะเป็นสำนวนที่น่าสนใจ / น่าสนใจ แต่เว็บของฉันค้นหาไม่ได้ส่งคืนสิ่งใดที่เกี่ยวข้อง man waitแสดง manpage "BASH_BUILTINS" ("BASH BUILTINS COMMAND") ซึ่งมีคำอธิบายดังต่อไปนี้: wait [n] Wait for the specified process and return its termination status. n may be a process ID …

2
สร้างตัวแปรและกำหนดค่าผ่านทางลูป (ทุบตี)
มีวิธีสร้างตัวแปร bash และกำหนดค่าผ่านลูปหรือไม่ บางสิ่งบางอย่างตาม: #!/bin/bash c=0 for file in $( ls ); do var"$c"="$file"; let c=$c+1; done แก้ไข: ขอบคุณ @Costas และ @mdpc สำหรับการชี้ให้เห็นว่านี่จะเป็นทางเลือกที่ไม่ดีสำหรับรายการ คำถามเป็นเชิงทฤษฎีเท่านั้น

3
มีวิธีที่จะมีฟังก์ชั่นในสคริปต์อัตโนมัติทุบตีของฉันทำงานกับข้อผิดพลาดคำสั่งใด ๆ ?
ฉันกำลังเขียนเชลล์สคริปต์ที่ต้องทำพวงคำสั่งและทุกคำสั่งขึ้นอยู่กับทุกคำสั่งก่อนหน้า หากคำสั่งใด ๆ ล้มเหลวสคริปต์ทั้งหมดควรล้มเหลวและฉันเรียกใช้ฟังก์ชัน exit ฉันสามารถตรวจสอบรหัสออกของแต่ละคำสั่ง แต่ฉันสงสัยว่ามีโหมดที่ฉันสามารถเปิดใช้งานหรือวิธีการทุบตีให้ทำโดยอัตโนมัติ ตัวอย่างเช่นใช้คำสั่งเหล่านี้: cd foo || myfunc rm a || myfunc cd bar || myfunc rm b || myfunc มีวิธีที่ฉันสามารถส่งสัญญาณไปยังเปลือกอย่างใดก่อนที่จะดำเนินการคำสั่งเหล่านี้ว่ามันควรจะเรียก myfunc หากพวกเขาล้มเหลวเพื่อให้ฉันสามารถเขียนสิ่งที่สะอาดเช่น: cd foo rm a cd bar rm b

5
คุณหยุด 'wget' หลังจากที่ได้รับ 404 ได้อย่างไร
หากคุณใช้การขยายรั้งด้วยwgetคุณสามารถดึงภาพที่มีหมายเลขตามลำดับได้อย่างง่ายดาย: $ wget 'http://www.iqandreas.com/sample-images/100-100-color/'{90..110}'.jpg' มันดึง 10 ไฟล์แรก90.jpgที่ถูก99.jpgปรับให้เป็นตัวเลขแต่100.jpgกลับมาเป็นข้อผิดพลาด404: ไฟล์ไม่พบไฟล์ (ฉันมีเพียง 100 ภาพเก็บไว้ในเซิร์ฟเวอร์) ไฟล์ที่ไม่มีอยู่เหล่านี้กลายเป็น "ปัญหา" มากกว่าถ้าคุณใช้ช่วงที่ใหญ่กว่าเช่น{00..200}ด้วยไฟล์ที่ไม่มีอยู่ 100 ไฟล์มันจะเพิ่มเวลาในการเรียกใช้งานสคริปต์และอาจกลายเป็นภาระเล็กน้อย (หรืออย่างน้อยก็สร้างความรำคาญ) เซิฟเวอร์. มีวิธีใดบ้างที่wgetจะหยุดหลังจากได้รับข้อผิดพลาด 404 ครั้งแรกหรือไม่ (หรือดียิ่งขึ้นสองในแถวในกรณีที่มีไฟล์หายไปในช่วงด้วยเหตุผลอื่น) คำตอบไม่จำเป็นต้องใช้การขยายรั้ง; ลูปก็ดีเช่นกัน

5
ย้ายไฟล์ตามรายการในไฟล์ (พร้อมช่องว่างนำหน้า)
ฉันมีไฟล์ที่มีชื่อไฟล์ ตัวอย่างเช่น: /tmp/list.txt (ขึ้นอยู่กับช่องว่างที่จุดเริ่มต้นของแต่ละบรรทัด): /tmp/file.log /app/nir/home.txt /etc/config.cust ฉันต้องการใช้หนึ่งบรรทัดเพื่อย้ายไฟล์ทั้งหมดที่ระบุไว้/tmp/list.txtไปยัง/app/dest ดังนั้นควรเป็นดังนี้: cat /tmp/list.txt | xargs mv /app/dest/

3
ป้องกัน EOF อัตโนมัติไปที่ไปป์ที่มีชื่อและส่ง EOF เมื่อฉันต้องการ
ฉันมีโปรแกรมที่ออกโดยอัตโนมัติเมื่ออ่าน EOF ในสตรีมที่กำหนด (ในกรณีต่อไปนี้ stdin) ตอนนี้ฉันต้องการสร้างเชลล์สคริปต์ซึ่งสร้างไพพ์ที่มีชื่อและเชื่อมต่อ stdin ของโปรแกรม จากนั้นสคริปต์จะเขียนไปยังไพพ์หลายครั้งโดยใช้echoและcat(และเครื่องมืออื่น ๆ ที่สร้าง EOF โดยอัตโนมัติเมื่อพวกเขาออก) ปัญหาที่ฉันเผชิญคือเมื่อสิ่งแรกechoเสร็จแล้วมันจะส่ง EOF ไปที่ไพพ์และทำให้โปรแกรมออกจาก ถ้าฉันใช้บางอย่างเช่นtail -fนั้นฉันจะไม่สามารถส่ง EOF เมื่อฉันตั้งใจจะออกจากโปรแกรม ฉันกำลังค้นคว้าวิธีแก้ปัญหาที่สมดุล แต่ก็ไม่มีประโยชน์ ฉันพบวิธีป้องกัน EOF และวิธีส่ง EOF ด้วยตนเองแล้ว แต่ไม่สามารถรวมเข้าด้วยกันได้ มีคำใบ้อะไรบ้าง? #!/bin/sh mkfifo P program < P & : # Run in background # < P tail -n +1 -f | program …

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