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

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

4
วิธีการจัดสรรอุปกรณ์ลูปแบบอะตอม?
ฉันกำลังเขียนเชลล์สคริปต์บางตัวเพื่อจัดการกับอิมเมจดิสก์บางอย่างและฉันต้องใช้อุปกรณ์วนรอบเพื่อเข้าถึงอิมเมจดิสก์บางตัว อย่างไรก็ตามฉันไม่แน่ใจว่าจะจัดสรรอุปกรณ์ลูปอย่างถูกต้องโดยไม่เปิดเผยโปรแกรมของฉันให้อยู่ในสภาพการแข่งขันได้อย่างไร ฉันรู้ว่าฉันสามารถใช้losetup -fเพื่อรับอุปกรณ์ลูปที่ไม่ได้ถูกจัดสรรถัดไปจากนั้นจัดสรรอุปกรณ์ลูปนั้นดังนี้: ld=$(losetup -f) sudo losetup $ld myfile.img dostuffwith $ld อย่างไรก็ตามในกรณีที่ฉันต้องการเรียกใช้โปรแกรมหลายอินสแตนซ์ในเวลาเดียวกันนี่เป็นตัวอย่างหนังสือเรียนเกี่ยวกับสภาพการแข่งขันและนั่นทำให้ฉันรำคาญมาก หากฉันมีหลายอินสแตนซ์ของโปรแกรมนี้ทำงานอยู่หรือโปรแกรมอื่น ๆ ที่พยายามรับอุปกรณ์วนซ้ำแต่ละกระบวนการอาจไม่สามารถจัดสรรอุปกรณ์วนรอบก่อนการเรียกครั้งต่อไปlosetup -fซึ่งในกรณีนี้ทั้งสองกระบวนการคิดว่าการวนซ้ำเดียวกัน อุปกรณ์มีให้ แต่จะมีได้เพียงอันเดียวเท่านั้น ฉันสามารถใช้การซิงโครไนซ์ภายนอกสำหรับสิ่งนี้ แต่ฉันต้องการ (ถ้าเป็นไปได้) หลีกเลี่ยงความซับซ้อนเพิ่มเติม นอกจากนี้โปรแกรมอื่น ๆ ที่ใช้อุปกรณ์ลูปจะไม่เคารพการซิงโครไนซ์ใด ๆ ฉันจะหลีกเลี่ยงสภาพการแข่งขันที่เป็นไปได้นี้ได้อย่างไร โดยหลักการแล้วฉันต้องการค้นพบและผูกอุปกรณ์ลูปแบบอะตอมเช่นด้วยคำสั่งเช่น: ld=$(sudo losetup -f myfile.img) dostuffwith $ld อย่างไรก็ตามเมื่อฉันทำเช่นนั้น$ldไม่ได้รับการกำหนดเส้นทางอุปกรณ์ลูปและย้ายsudoออกในขณะที่sudo ld=$(losetup -f myfile.img)ให้ข้อผิดพลาดในการอนุญาต

4
ฉันจะวัดระยะเวลาที่สคริปต์ของฉันใช้ในการรันและรวมไว้ในอีเมลที่สร้างขึ้นได้อย่างไร
ฉันมีสคริปต์ทุบตีง่ายๆที่ทำงานชุดของการตรวจสอบ (กping, nslookupฯลฯ ) แล้วส่งรายงานอีเมลที่มีการส่งออกของข้อมูลว่า ฉันต้องการให้อีเมลรวมข้อมูลว่าต้องใช้เวลานานเท่าใดในการเรียกใช้สคริปต์ทั้งหมด มีวิธีง่าย ๆ ในการรวบรวมข้อมูลหรือไม่

2
วงเล็บทำงานในเปลือก bash เอง แต่ไม่ใช่ใน bash script
ฉันสามารถเรียกใช้คำสั่งนี้จากพรอมต์บรรทัดคำสั่งของฉัน: cp -r folder/!(exclude-me) ./ หากต้องการคัดลอกเนื้อหาทั้งหมดซ้ำfolder ยกเว้นไดเรกทอรีย่อยที่มีชื่อexclude-meลงในไดเรกทอรีปัจจุบัน งานนี้ตรงตามที่ตั้งใจไว้ อย่างไรก็ตามฉันต้องการสิ่งนี้เพื่อทำงานในสคริปต์ทุบตีที่ฉันเขียนซึ่งฉันมีสิ่งนี้: if [ -d "folder" ]; then cp -r folder/!(exclude-me) ./ rm -rf folder fi แต่เมื่อฉันเรียกใช้สคริปต์: bash my-script.sh ฉันได้รับสิ่งนี้: my-script.sh: line 30: syntax error near unexpected token `(' my-script.sh: line 30: ` cp -r folder/!(exclude-me) ./' และฉันก็ไม่รู้ว่าทำไมมันถึงทำงานได้จาก command prompt แต่บรรทัดเดียวกันที่แน่นอนไม่สามารถใช้งานได้ในสคริปต์ทุบตี

2
มีปัญหากับอักขระการนับสคริปต์เชลล์
ฉันพยายามที่จะเรียนรู้พื้นฐานและฉันประสบปัญหากับสคริปต์ของฉันนับตัวอักษรของการป้อนข้อมูลของผู้ใช้ นี่คือสคริปต์ของฉันมีใครช่วยชี้ให้เห็นว่าฉันผิดไปไหม #!/bin/bash echo "Enter a word!" read INPUT_STRING len= echo $INPUT_STRING | wc -c echo "Your character length is " $len exit

3
ฉันจะรับพา ธ สัมบูรณ์จากการใช้คำสั่ง find unix ได้อย่างไร
วิธีรับพา ธ สัมบูรณ์โดยใช้คำสั่ง find จริง ๆ แล้วฉันกำลังเรียกใช้สคริปต์ต่อไปนี้: - find . -size +20M | while read a do i=$(echo $a | sed 's:/: :g') echo $a; j=($i) fileName=${j[${#j[@]}-1]} userName=${j[${#j[@]}-3]} done แต่ตัวแปรที่นี่$aเส้นทางเริ่มต้นจากการแสดงแต่ฉันต้องการเส้นทางที่แน่นอนจาก./Downloads/filename/

6
สคริปต์เพื่อแยกรายการที่เลือกจากไฟล์ bibtex
ฉันมีไฟล์ bibtex ขนาดใหญ่ที่มีหลายรายการที่แต่ละรายการมีโครงสร้างทั่วไป @ARTICLE{AuthorYear, item = {...}, item = {...}, item = {...}, etc } (ในบางกรณีARTICLEอาจเป็นคำอื่นเช่นBOOK) สิ่งที่ฉันต้องการจะทำคือเขียนสคริปต์ง่ายๆ (โดยเฉพาะอย่างยิ่งสคริปต์ shell) เพื่อแยกรายการที่มี AuthorYear ที่กำหนดและใส่ลงในไฟล์. ibib ใหม่ ฉันสามารถจินตนาการได้ว่าฉันสามารถจำประโยคแรกของรายการโดย AuthorYear และประโยคสุดท้ายด้วยการปิดครั้งเดียว}และอาจใช้sedเพื่อแยกรายการ แต่ฉันไม่รู้วิธีการทำสิ่งนี้อย่างแท้จริง มีคนบอกฉันได้ไหมว่าฉันจะทำสิ่งนี้ได้อย่างไร มันน่าจะเป็นอะไรซักอย่าง sed -n "/AuthorYear/,/\}/p" file.bib แต่นั่นจะหยุดเนื่องจากการปิด}ในรายการแรกของรายการจึงให้ผลลัพธ์นี้: @ARTICLE{AuthorYear, item = {...}, ดังนั้นฉันจึงจำเป็นต้องรู้ว่า}ตัวละครตัวนี้เป็นตัวเดียวในบรรทัดหรือไม่และมีเพียง 'sed' ที่จะหยุดอ่านเมื่อเป็นกรณีนี้

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
เหตุใดฉันจึงไม่สามารถฆ่าการหมดเวลาที่เรียกจากสคริปต์ 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เมื่อมันถูกเรียกใช้จากภายในสคริปต์ ฉันสามารถค้นหารหัสกระบวนการและฆ่าด้วยวิธีนั้น แต่ทำไมฉันไม่สามารถใช้การกดแป้นพิมพ์มาตรฐาน และมีวิธีการจัดโครงสร้างสคริปต์ของฉันเพื่อให้ฉันสามารถ?

3
วางแผน gnuplot อัตโนมัติด้วย bash
ฉันมี 6 ไฟล์ที่จะต้องพล็อตเป็นกราฟเส้นที่มีระยะขอบผิดพลาดและส่งออกไปยังไฟล์ png ที่แตกต่างกัน รูปแบบไฟล์มีดังนี้ วินาทีหมายถึงค่าเฉลี่ยขั้นต่ำสูงสุด ฉันจะวางแผนกราฟเหล่านี้โดยอัตโนมัติได้อย่างไร ดังนั้นฉันเรียกใช้ไฟล์ที่เรียกว่า bash.sh และจะได้รับ 6 ไฟล์และส่งกราฟไปยัง.pngไฟล์ที่แตกต่างกัน ต้องระบุชื่อเรื่องและป้ายกำกับแกนด้วย

2
ไปป์สำหรับเอาท์พุตป้องกันการแก้ไขตัวแปรท้องถิ่น
ฉันพยายามเขียนฟังก์ชั่นทุบตีง่ายๆที่ใช้เป็นอาร์กิวเมนต์จำนวนไฟล์และ / หรือไดเรกทอรี มันควรจะ: มีคุณสมบัติชื่อไฟล์อย่างเต็มที่ เรียงพวกเขา ลบรายการซ้ำ พิมพ์ทั้งหมดที่มีอยู่จริง ส่งคืนจำนวนไฟล์ที่ไม่มีอยู่ ฉันมีสคริปต์ที่เกือบจะทำในสิ่งที่ฉันต้องการ แต่ก็ล้มเหลวในการเรียงลำดับ ค่าส่งคืนของสคริปต์ตามที่ถูกต้อง แต่ผลลัพธ์ไม่ได้ (ไม่ได้เรียงลำดับและทำซ้ำ) ถ้าฉันบรรทัดเหล่า| sort -uคำสั่งตามที่ระบุเอาท์พุทที่ถูกต้อง 0แต่ค่าตอบแทนอยู่เสมอ ยินดีต้อนรับโซลูชัน NB ที่เรียบง่ายในการแก้ปัญหา แต่เป็นคำถามเกี่ยวกับสาเหตุที่เกิดขึ้นในรหัสที่ฉันมี นั่นคือเหตุใดการเพิ่มไพพ์จึงดูเหมือนว่าจะหยุดสคริปต์ที่เพิ่มค่าตัวแปรr? นี่คือสคริปต์: function uniqfile { local r=0 for arg in "$@" do readlink -e "$arg" || (( ++r )) done #| sort -u ## remove that comment return …

2
วันที่ - ปีก่อนปี 1901 ถือว่าไม่ถูกต้อง
ฉันมีวันที่ (GNU coreutils) 7.1 ติดตั้งบนระบบของฉัน หากฉันพยายามตรวจสอบวันที่ก่อนวันที่ 14 ธันวาคม 1901 ฉันได้รับข้อผิดพลาด "วันที่ไม่ถูกต้อง" ตัวอย่างเช่น, $ date -d 1901-12-13 date: invalid date `1901-12-13' $ date -d 1901-12-14 Sat Dec 14 00:00:00 EST 1901 ฉันควรทำอย่างไรเพื่อให้dateยูทิลิตี้ในการรักษาหลายปีก่อนปี 1901 ว่าถูกต้อง? ฉันได้รับข้อผิดพลาดที่คล้ายกันสำหรับวันที่หลังจาก 19 ม.ค. 2038

1
ฉันจะสร้างเชลล์สคริปต์ที่ส่งเอาต์พุตไปยังกระบวนการได้อย่างไร
ฉันกำลังใช้งานโปรแกรมคอนโซลเซิร์ฟเวอร์ในหน้าจอเพราะฉันจำเป็นต้องอ่านและส่งคำสั่งเป็นครั้งคราว ฉันต้องการเรียกใช้แอปเป็น daemon ในพื้นหลัง (เริ่ม / หยุดด้วย init) ฉันสามารถtail -fบันทึกได้ แต่นั่นจะไม่ให้ฉันส่งข้อมูลไปยังกระบวนการ มีวิธีใดบ้างในการตั้งค่านี้เพื่อให้ฉันสามารถอ่านและส่งอินพุตได้ แต่ยังคงทำงานในพื้นหลังหรือไม่ ฉันต้องการที่จะสามารถส่งอินพุตไปยัง daemon จากกระบวนการที่แตกต่างกันเช่นกัน (เชลล์สคริปต์ที่สามารถส่งคำสั่ง "Stop \ n" เป็นต้น)

3
Shell Script: การสร้างตัวแปรพร้อมตัวเลือกภายใน
ฉันมีคำสั่ง rsync พร้อมพารามิเตอร์ต่อไปนี้: rsync -avz --{partial,stats,delete,exclude=".*"} ฉันต้องการวางพารามิเตอร์นั้นไว้ในตัวแปรเพื่อนำมาใช้ใหม่ในสคริปต์ บางสิ่งเช่นนี้ #!/bin/bash VAR=rsync -avz --{partial,stats,delete,exclude=".*"} $VAR /dir1 /dir2 ฉันได้ลองด้วยคำพูดคำพูดเดี่ยววงเล็บไม่ประสบความสำเร็จ

3
$ HOME / bin dir ไม่ได้อยู่บน $ PATH
ในฉัน~/.profileฉันมีบล็อกสุดท้ายซึ่งควรโหลดส่วนบุคคลของฉันbin/ directoryเช่นนี้: # set PATH so it includes user's private bin if it exists if [ -d "$HOME/bin" ] ; then PATH="$HOME/bin:$PATH" fi แต่ดูเหมือนจะไม่โหลด: echo $PATH /usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games ทำไมสิ่งนี้ถึงไม่ทำงาน (เปลือกของฉันคือทุบตี) แก้ไขสำหรับ Tigger echo $0 => bash echo $HOME => /home/student whoami => student less /etc/*-release => PRETTY_NAME="Debian GNU/Linux 9 (stretch)" NAME="Debian …

3
BASH และพฤติกรรมการคืนรถ
ฉันมีหนึ่งคำถามที่รวดเร็ว เป็นเรื่องปกติหรือไม่ที่ bash (ฉันใช้ 4.4.11) ไม่แสดงบรรทัด / ข้อความที่คั่น / จบด้วย plain \r? ฉันรู้สึกประหลาดใจเล็กน้อยที่เห็นพฤติกรรมนี้: $ a=$(printf "hello\ragain\rgeorge\r\n") $ echo "$a" george แต่ข้อความ "hello อีกครั้ง" ยังคงอยู่ที่นั่นอย่างใด "ซ่อน": $ echo "$a" |od -w32 -t x1c 0000000 68 65 6c 6c 6f 0d 61 67 61 69 6e 0d 67 65 6f 72 67 …

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