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

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

1
การใช้ getopts เพื่อแยกวิเคราะห์ตัวเลือกหลังจากอาร์กิวเมนต์ที่ไม่ใช่ตัวเลือก
ฉันมีสคริปต์ทุบตีดังต่อไปนี้ในแฟ้มที่ฉันต้องการที่จะทำงานเป็นnepleaks_upd.sh ./nepleaks_upd.sh bootstrap --branch offไม่สามารถทำให้มันจะใช้เวลาแต่สิ่งที่จะทำงานร่วมกับมี--branch./nepleaks_upd.sh bootstrap -b off usage() { echo "Usage: $0 [prepare | up | down] [-b <on/off>]" 1>&2; exit 1; } case "$1" in bootstrap) while getopts ":b:" o; do case "${o}" in b) b=${OPTARG} if [ ${b} == "off" ]; then echo "git clone https://github.com/iPrayag/dotfiles.git" ## …

1
ใช้ inotify เพื่อตรวจสอบไดเรกทอรี แต่ไม่ทำงาน 100%
ฉันได้เขียนสคริปต์ทุบตีเพื่อตรวจสอบไดเรกทอรีเฉพาะ/root/secondfolder/: #!/bin/sh while inotifywait -mr -e close_write "/root/secondfolder/" do echo "close_write" done เมื่อผมสร้างไฟล์ชื่อfourth.txtใน/root/secondfolder/และเขียนสิ่งที่มันบันทึกและปิดมันมันจะออกผลลัพธ์ต่อไปนี้: /root/secondfolder/ CLOSE_WRITE,CLOSE fourth.txt อย่างไรก็ตามมันไม่ได้สะท้อน "close_write" ทำไมถึงเป็นอย่างนั้น?

3
การใช้เชลล์สคริปต์เป็นเครื่องพิมพ์เสมือน
ฉันมีเชลล์สคริปต์ที่ใช้ไฟล์ PDF เป็นอาร์กิวเมนต์และพิมพ์ด้วยตัวเลือกเฉพาะเครื่องพิมพ์เพิ่มเติม ฉันจะเพิ่มสคริปต์นี้เป็นเครื่องพิมพ์เสมือนที่สามารถเลือกได้จาก GUI ได้อย่างไร เชลล์สคริปต์เป็นสคริปต์เพล็กซ์แบบแมนนวลที่ใช้ไฟล์ PDF พิมพ์หน้าคู่ให้พรอมต์ผู้ใช้โดยใช้ zenity เพื่อให้ผู้ใช้พลิกหน้าจากนั้นพิมพ์หน้าคี่ เวิร์กโฟลว์ปัจจุบันของฉันคือ: ไฟล์ -> พิมพ์ -> บันทึกเป็นไฟล์ -> tmp.pdf my_duplex_script tmp.pdf rm tmp.pdf มีวิธีที่จะทำให้มันเป็น: ไฟล์ -> พิมพ์ -> my_script_as_virtual_printer หมายเหตุ: นี่เป็นบน Linux mint 13 cinnamon ฉันลองแล้วgnome-manual-duplexแต่ใช้ไม่ได้สำหรับฉัน กล่องโต้ตอบ GUI ซึ่งฉันสามารถพิมพ์เป็นไฟล์ PDF ได้ my_duplex_script #!/bin/bash lp_args= while getopts o: opt do case …

2
ส่งสำเนาของเอาต์พุตสคริปต์ไปยังไฟล์
สมมติว่าฉันมีสคริปต์ Zsh และฉันต้องการให้มันพิมพ์ผลลัพธ์ไปSTDOUTยัง แต่ก็คัดลอก (ดัมพ์) เอาต์พุตไปยังไฟล์ในดิสก์ ยิ่งกว่านั้นสคริปต์เริ่มต้นด้วยตัวเลือกต่อไปนี้ set -o xtrace ซึ่งบังคับให้มันเป็น verbose และพิมพ์คำสั่งที่มันทำงาน ฉันต้องการที่จะจับเอาท์พุทนี้เช่นกันในไฟล์ในดิสก์ ความเข้าใจของฉันคือถ้าฉันทำ ./my_script.sh > log.txt มันจะส่งSTDOUTไปlog.txtแต่ถ้าฉันต้องการที่จะเห็นเอาท์พุทใน terminal? ฉันได้อ่านเกี่ยวกับteeและMULTIOSตัวเลือกใน zsh แต่ฉันไม่แน่ใจว่าจะใช้พวกเขา เมื่อฉันทำ: ./my_script | tee log.txt ฉันสามารถเห็นผลลัพธ์บนเทอร์มินัล แต่ไฟล์ไม่log.txtเห็นว่าจะจับทุกอย่าง (อันที่จริงมันเก็บแทบทุกอย่าง)

2
คำสั่ง Bash ในสตริงกำลังทำงานเมื่อฉันสร้างสตริงไม่ใช่เมื่อฉันใช้ในภายหลัง
ฉันค่อนข้างใหม่เปลือกสคริปต์ แต่ได้เกือบเสร็จสมบูรณ์สคริปต์ซึ่งทำให้การใช้เป็นโปรแกรม lftp ส่วนของสคริปต์ที่ฉันมีปัญหาคือเมื่อฉันสร้างคำสั่งยาว ๆ (คั่นด้วย;) for var in something do ... commands_to_run+="echo Result is `tail -n 1 $somefile`;" done สิ่งที่ฉันสังเกตเห็นคือtailโปรแกรมที่ห่อใน backticks กำลังถูกเรียกใช้เมื่อ for for วนซ้ำ แต่ไม่ใช่เมื่อฉันเรียกใช้ชุดคำสั่งในสคริปต์ของฉัน น่าเสียดายที่เนื้อหาของ $ somefile ยังไม่พร้อมสำหรับการตรวจสอบ ฉันจะรับคำสั่งให้ดำเนินการเมื่อฉันต้องการมันได้หรือไม่ในขณะที่ฉันกำลังสร้างสตริง?

2
แคชรหัสผ่านคีย์ย่อย gpg ทั้งหมดในครั้งเดียว? ป้องกันความจำเป็นในการป้อนรหัสผ่าน gpg หลายรายการหรือไม่
ฉันสามารถป้อนรหัสผ่าน gpg เพียงครั้งเดียวและปลดล็อคคีย์ย่อยทั้งหมดของฉัน (การเซ็นการถอดรหัสการรับรองความถูกต้อง) ได้หรือไม่ ในตอนนี้ฉันต้องป้อนรหัสผ่าน gpg ของฉันสามครั้ง (สำหรับการเซ็นชื่อเพื่อถอดรหัสเพื่อการรับรองความถูกต้อง) สิ่งนี้ไม่สะดวก ฉันพยายามหาเชลล์สคริปต์ #!/bin/bash set -x set -e set +o history signing_key=77BB3C48 encryption_key=CE998547 tempfile="$(mktemp)" echo "test" > testfile unset passphrase || exit 1 read -sp 'Enter password. ' passphrase ; echo exec 3<<<"$passphrase" gpg2 --no-tty --use-agent --batch --yes --passphrase-fd 3 --sign-with "$signing_key" …

2
ตัวแปรโลคัลใน zsh: อะไรคือสิ่งที่เทียบเท่ากับ bash ของ“ export -n” ใน zsh
ฉันพยายามที่จะ จำกัด ขอบเขตของตัวแปรให้กับเชลล์และไม่มีลูกให้ดูใน zsh ตัวอย่างเช่นฉันพิมพ์สิ่งนี้ใน. zshrc: GREP_OPTIONS=--color=always แต่ถ้าฉันรันเชลล์สคริปต์ด้วยสิ่งต่อไปนี้: #!/bin/bash echo $GREP_OPTIONS ผลลัพธ์คือ: --color=always ในขณะที่ฉันต้องการให้เป็นโมฆะ (เชลล์สคริปต์ด้านบนไม่ควรเห็นตัวแปร GREP_OPTIONS เลย) ในทุบตีใครจะพูดว่า: export -n GREP_OPTIONS=--color=alwaysซึ่งจะป้องกันไม่ให้เกิดเหตุการณ์ ฉันจะทำสิ่งนี้ให้สำเร็จใน zsh ได้อย่างไร?


4
การคืนค่าจากฟังก์ชัน bash
ฉันมีฟังก์ชั่นซึ่งจะคืนค่า 1 หากจำนวนนั้นเป็นตัวเลขสิบหลักที่ถูกต้อง: valNum() { flag=1 if [[ $1 != [1-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] ]]; then echo "Invalid Number" flag=0 fi return $flag } มันกำลังถูกเรียกโดย: if [[ $(valNum $num) -eq 1 ]]; then #do something fi ฟังก์ชั่นทำงานได้ดีถ้าตัวเลขนั้นถูกต้อง แต่มีการแสดงข้อผิดพลาดทางไวยากรณ์หากใส่หมายเลขที่ไม่ถูกต้อง

3
การกำหนดเอาต์พุตของเคียวรี SQL ให้กับตัวแปร
ฉันกำลังเชื่อมต่อกับฐานข้อมูล Oracle และยิงแบบสอบถามและกำหนดผลลัพธ์ให้กับตัวแปร แต่เมื่อฉันสะท้อนค่าของตัวแปรมันไม่ได้รับการพิมพ์อย่างถูกต้อง count=`sqlplus -s $configuser/$configpass@$ORACLE_SID <<END set pagesize 0 feedback off verify off heading off echo off; select max(cust_id) from cutomers exit; END` echo $count แบบสอบถามส่งคืนผลลัพธ์ที่ถูกต้องเมื่อเรียกใช้งานบนฐานข้อมูล แต่ตัวแปร "นับ" มีค่าที่ไม่ถูกต้อง

5
ฉันจะใช้คำสั่ง If-Else ตามวันในสัปดาห์ได้อย่างไร
ปัญหา: ฉันต้องตรวจสอบว่าวันนี้เป็นวันพฤหัสบดีหรือไม่และดำเนินการต่าง ๆ ตามผลลัพธ์ของเงื่อนไขนี้ ฉันลองวิธีที่แตกต่างกันสองวิธี: ได้รับชื่อวัน: DAYOFWEEK=$(date +"%a") echo DAYOFWEEK: $DAYOFWEEK if ["$DAYOFWEEK" == "Thu"]; then echo YES else echo NO fi รับวัน NUM: DAYOFWEEK=$(date +"%u") echo DAYOFWEEK: $DAYOFWEEK if ["$DAYOFWEEK" == 4]; then echo YES else echo NO fi ในทั้งสองกรณีผลลัพธ์คือ NO แม้ว่ามันควรจะเป็นใช่ เกิดอะไรขึ้น?

2
วิธีที่ดีในการเปรียบเทียบเวลา
ฉันต้องตรวจสอบเวลาปัจจุบันและยกเลิกสคริปต์หากไม่ใช่เวลาที่เหมาะสมของวันที่ฉันควรจะรัน นอกจากนี้หากใครก็ตามที่ทำงานมันควรยกเลิก ตัวอย่างเช่น: ฉันต้องการสคริปต์ของฉันให้ทำงานเฉพาะเมื่อเริ่มต้นระหว่าง 22.00 น. ถึง 2.00 น. (หน้าต่าง 4 ชั่วโมง) ขณะนี้ฉันกำลังทำต่อไปนี้ สละเวลากับdate +%k%Mและเปรียบเทียบกับหมายเลขที่เข้ารหัสยาก #!/bin/sh currTime=`date +%k%M` check_time_to_run() { tempTime=$1 if [ $tempTime -gt 200 -a $tempTime -lt 2200 ]; then echo "Time is between 2 AM and 10 PM. Aborting." exit 1 else echo "Time is after 10 …

1
ค้นหาโฟลเดอร์ทั้งหมดในไดเรกทอรีที่มีเนื้อหาเหมือนกัน
ในอูบุนตูมีใครบ้างที่จะค้นหาโฟลเดอร์ที่ซ้ำกันในไดเรกทอรี (เช่นโฟลเดอร์ที่มีเนื้อหาเดียวกัน) ฉันคิดว่ามีเครื่องมือบรรทัดคำสั่งบางตัวสำหรับค้นหาไฟล์ที่ซ้ำกัน (เช่น fdupes) แต่ฉันต้องการค้นหาโฟลเดอร์ที่ซ้ำกันแทน นั่นคือค้นหาโฟลเดอร์ที่ตรงกับเนื้อหาของไฟล์ที่มี (แม้ว่าชื่อไฟล์และข้อมูลเมตาอื่น ๆ อาจแตกต่างกัน)

3
เชลล์สคริปต์ยังคงทำงานโดยไม่มี #! (บรรทัด sha-bang)
ฉันใหม่สำหรับเชลล์สคริปต์และหนังสือจำนวนมากเขียนว่าใช้บรรทัด #! (sha-bang) ในการเริ่มต้นสคริปต์เพื่อเรียกล่ามและสิ่งนี้จะเรียกเชลล์ใหม่สำหรับสคริปต์และทำการแปลบรรทัดตามบรรทัด แต่อย่างใดอย่างหนึ่ง ของสคริปต์พื้นฐานของฉันยังคงทำงานอยู่โดยไม่มีสายเวทย์ ดังนั้นคำถามของฉันคือ: สคริปต์พื้นฐานของฉันรับล่ามมาจากไหน สคริปต์จัดการเพื่อค้นหาล่ามได้อย่างไร ตอนนี้ให้ฉันบอกคุณเกี่ยวกับสคริปต์พื้นฐานของฉันมันมีเพียงบรรทัดต่อไปนี้: echo "สคริปต์พื้นฐานไม่มีเส้นวิเศษ"

3
ฉันจะตั้งสคริปต์ที่จะเริ่มต้นใน FreeBSD ได้อย่างไร
ฉันใช้ FreeBSD 9 และฉันต้องการสร้างสคริปต์ที่จะตรวจสอบว่าสายเคเบิลอีเธอร์เน็ตเชื่อมต่ออยู่หรือไม่และหากเป็นเช่นนั้นให้เชื่อมต่อกับมัน ฉันต้องการตั้งค่าเพื่อให้มันทำงานเมื่อใดก็ตามที่เครื่องเริ่มทำงานหรือเมื่อใดก็ตามที่ฉันเข้าสู่ระบบฉันดูที่หนังสือ UNIX ของฉัน (มันค่อนข้างล้าสมัยและสำหรับ UNIX ทั่วไปไม่ใช่ FreeBSD เฉพาะ) และมันบอกว่าฉันสามารถใช้ crontab แต่ฉันสามารถทำได้เพื่อให้สิ่งต่าง ๆ ทำงานในบางช่วงเวลาไม่ใช่เมื่อมันเริ่มทำงาน ใครช่วยกรุณาบอกฉันว่าฉันจะได้รับที่นี้

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