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

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

1
วิธีตัดรหัสสีออกจาก stdout และ pipe ไปยัง file และ stdout
ฉันมีโปรแกรมที่ใช้printfกับบางtputผสมอยู่ในนั้นและฉันต้องการที่จะท่อส่งออกไป stdout เช่นเดียวกับไฟล์ ฉันต้องการที่จะใช้sedเนื่องจากฉันไม่ต้องการการพึ่งพาที่ไม่จำเป็นในสคริปต์ของฉัน นี่คือสิ่งที่ฉันได้รับจนถึง printf "\n$(tput setaf 6)| $(tput sgr0)$(tput setaf 7)Sourcing files...\033[m\n" | tee install.log ปัญหาเดียวของเรื่องนี้คือไฟล์บันทึกของฉันกำลังรับเอาท์พุทสีทั้งหมดเช่นนี้ ... ^[[36m| ^[(B^[[m^[[37mSourcing files...^[[m ฉันอยากให้มันมี | Sourcing files...

2
วิธีที่สอดคล้องกับ POSIX ในการทำงานกับรายการชื่อไฟล์ที่อาจมีช่องว่าง
ฉันได้เห็นคำแนะนำในการเขียนสคริปต์ของ Bash แนะนำให้ใช้อาร์เรย์สำหรับทำงานกับชื่อไฟล์ที่มีช่องว่าง แต่DashAsBinShชี้ให้เห็นว่าอาร์เรย์ไม่สามารถเคลื่อนย้ายได้ดังนั้นฉันกำลังมองหาวิธีการทำงานร่วมกับ POSIX ในการทำงานกับรายการชื่อไฟล์ที่อาจมีช่องว่าง ฉันต้องการแก้ไขสคริปต์ตัวอย่างด้านล่างเพื่อที่จะได้ echo foo/target/a.jar foo/target/b.jar bar/target/lol whitespace.jar นี่คือสคริปต์ #!/usr/bin/env sh INPUT="foo/target/a.jar foo/target/b.jar bar/target/b.jar bar/target/lol whitespace.jar" # this would be produced by a 'ls' command # We can execute the ls within the script, if it helps dostuffwith() { echo $1; }; F_LOCATIONS=$INPUT ALL_FILES=$(for f in …

4
ความแตกต่างระหว่าง Ctrl-Z และ kill -STOP คืออะไร
เมื่อฉันเรียกใช้คำสั่ง ( makeในโครงการขนาดใหญ่) จากเชลล์ฉันสามารถพิมพ์ Ctrl-Z เพื่อหยุดกระบวนการและกลับไปที่เชลล์ ต่อจากนั้นฉันสามารถเรียกใช้fgเพื่อดำเนินการตามกระบวนการต่อไป ฉันกำลังพยายามเขียนเชลล์สคริปต์เพื่อทำสิ่งนี้โดยอัตโนมัติ (โดยเฉพาะเพื่อตรวจสอบอุณหภูมิ CPU ของฉันทุกสองสามวินาทีและหยุดกระบวนการถ้ามันร้อนเกินไปเนื่องจากคอมพิวเตอร์ของฉันมีแนวโน้มที่จะร้อนเกินไป) ความพยายามครั้งแรกของฉันทำงานเช่นนี้ (ลดความซับซ้อน): make & subpid="$!" sleep 2 # If the CPU temperature is too high... kill -STOP "$subpid" sleep 2 # If the CPU temperature has dropped to safe levels... kill -CONT "$subpid" wait "$subpid" น่าเสียดายที่นี่ใช้งานไม่ได้ การส่ง SIGSTOP ไปยังกระบวนการไม่ได้หยุดชั่วคราว …

2
เมื่อใดจึงควรใช้เซมิโคลอนระหว่างตัวแปรสภาวะแวดล้อมและคำสั่ง
ทุกคนสามารถอธิบายได้หรือไม่ว่าทำไมเซมิโคลอนจึงมีความจำเป็นเพื่อที่LANGจะเห็นการอัปเดตโดยการทุบตี? ใช้งานไม่ได้: > LANG=Ja_JP bash -c "echo $LANG" en_US ผลงาน: > LANG=Ja_JP ; bash -c "echo $LANG" Ja_JP ฉันทำงานกับทั้งทุบตี 4.1.10 ใน linux และรุ่นเดียวกันภายใต้ cygwin

4
ค้นหา -exec ในสคริปต์ทุบตีพร้อมส่วนขยายตัวแปร
ฉันพยายามเรียกใช้คำสั่งคล้ายกับคำสั่งด้านล่างในสคริปต์ทุบตี มันควรจะค้นหาผ่านโฟลเดอร์ย่อยทั้งหมดและคัดลอกไฟล์ทั้งหมดของบางประเภทให้อยู่ในระดับรากของ$sourcedir$targetdir #!/bin/bash # These are set as arguments to the script, not hard-coded sourcedir="/path/to/sourcedir" targetdir="/path/to/targetdir" find "$sourcedir" -type f -name "*.type" -exec sh -c 'cp "$1" "$2/`basename "$1"`"' "{}" "$targetdir" \; นี้ดูเหมือนว่าจะสวยใกล้เคียงยกเว้นว่า{}จะไม่ถูกส่งผ่านไปในขณะที่$2ไป-exec sh -c ... ฉันต้องการทำเช่นนี้ให้ใกล้เคียงกับ "ทางที่ถูกต้อง" ที่สุดเท่าที่จะทำได้ด้วยความอดทนสำหรับตัวละครพิเศษในชื่อไฟล์ แก้ไข:ฉันเห็นคนแนะนำให้ใช้xargsหรือการผูกมัดข้อโต้แย้ง ฉันอยู่ภายใต้การแสดงผลว่านี่เป็นเพียงข้อโต้แย้งที่ จำกัด ตัวอย่างเช่นถ้าฉันมีไฟล์. jpg หลายพันไฟล์ที่ฉันพยายามคัดลอกจากไดเรกทอรีแกลเลอรี่จำนวนมากไปยังไดเรกทอรีสไลด์โชว์ยักษ์โซลูชั่นการเชื่อมโยงจะยังคงใช้งานได้หรือไม่ แก้ไข 2:ปัญหาของฉันคือฉันหายไป_ก่อนที่ตัวเลือกแรกของฉันที่จะดวลจุดโทษใน-execคำสั่ง สำหรับทุกคนที่สงสัยเกี่ยวกับวิธีทำให้คำสั่ง find ทำงานได้เพิ่ม_และทุกอย่างจะดีขึ้น: …

7
เชลล์สคริปต์สำหรับการย้ายไฟล์ที่เก่าที่สุด?
ฉันจะเขียนสคริปต์เพื่อย้ายไฟล์ที่เก่าที่สุดเพียง 20 ไฟล์จากโฟลเดอร์หนึ่งไปยังอีกโฟลเดอร์ได้อย่างไร มีวิธีที่จะคว้าไฟล์ที่เก่าแก่ที่สุดในโฟลเดอร์หรือไม่?

2
วิธีใช้ Bash สำหรับ sh ใน Ubuntu
ฉันกำลังติดตั้งโปรแกรมขนาดใหญ่ซึ่งมีทรัพยากรเป็นrpmไฟล์ มันติดอยู่ที่เส้นของ #!/bin/sh SCITEGICPERLBIN=`dirname $0` SCITEGICPERLHOME=`dirname $SCITEGICPERLBIN` if [ $SCITEGICPERLHOME == "." ] เห็นได้ชัดว่าshทำงานbashใน Red Hat Linux ด้วยไวยากรณ์นี้ แต่ให้ข้อผิดพลาดunexpected operatorใน Ubuntu ฉันไม่สามารถเปลี่ยนสคริปต์bashเป็นสคริปต์มาจากrpmแพ็คเกจ ฉันสามารถแยกและบรรจุหีบห่อใหม่rpmแต่อาจมีสคริปต์ดังกล่าวจำนวนมาก มีวิธีการเปลี่ยนค่าเริ่มต้นของเชลล์เพื่อใช้#!/bin/shเป็นbashหรืออย่างอื่นซึ่งสามารถจัดการกับ[โอเปอเรเตอร์ได้หรือไม่?

3
-f, แทรกตัวแบ่งบรรทัดหลังจากบันทึกไม่ได้ใช้งานเป็นเวลา 3 วินาที?
เมื่อทำ a tail -f error.log, วิธีแทรกเส้นแบ่งโดยทางโปรแกรมหลังจากไม่มีสิ่งใดถูกผนวกเข้ากับไฟล์เป็นเวลา 3 วินาที? (เห็นได้ชัดว่าเมื่อมีการเพิ่มตัวแบ่งบรรทัดหนึ่งบรรทัดไม่ควรเพิ่มตัวแบ่งบรรทัดอื่น ๆ จนกว่าจะมีการเพิ่มบรรทัดข้อความอื่น ๆ ลงในไฟล์บันทึก) ตัวอย่างเช่นบรรทัดเหล่านี้ถูกผนวกเข้ากับ error.log: foo bar boo [[wait 4 seconds]] 2far 2foo 2bar 2boo [[wait 40 seconds]] 2far นี่จะเป็นผลลัพธ์ในคอนโซล: foo bar boo 2far 2foo 2bar 2boo 2far

4
มีบางกรณีที่จำนวนช่องว่างมีความสำคัญในสคริปต์ทุบตี (หรือเชลล์อื่น ๆ )
ฉันได้รับแจ้งว่าช่องว่างมีความสำคัญในbashหรือเชลล์สคริปต์อื่น ๆ และฉันไม่ควรเปลี่ยนการมีอยู่ของช่องว่างเว้นแต่ว่าฉันรู้ว่าฉันกำลังทำอะไรอยู่ โดย "เปลี่ยนการดำรงอยู่" ฉันหมายถึงการแทรกช่องว่างระหว่างอักขระที่ไม่ใช่ช่องว่างสองตัวหรือลบช่องว่างระหว่างอักขระที่ไม่ใช่ช่องว่างสองตัวเช่นการเปลี่ยนvar="$val"เป็นvar ="$val"หรือกลับกัน ฉันต้องการถาม มีกรณีใดบ้างที่ใช้ช่องว่างเดียวหรือใช้ช่องว่างต่อเนื่องหลายรายการในเชลล์สคริปต์สร้างความแตกต่าง? . (แน่นอนการแทรก / ลบช่องว่างในเครื่องหมายคำพูดสร้างความแตกต่างเช่นเปลี่ยนจากecho "a b"เป็นecho "a b"หรือกลับกันฉันกำลังมองหาตัวอย่างนอกเหนือจากตัวอย่างเล็กน้อย) ฉันเจอคำถามนี้แล้วแต่มีอยู่เรื่องหนึ่งเกี่ยวกับการเพิ่มและลบช่องว่างระหว่างอักขระที่ไม่ใช่ช่องว่างสองตัวที่ฉันรู้ตัวอย่างมากมายว่ามันจะสร้างความแตกต่าง ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชม รวมเปลือกหอยให้มากขึ้นถ้าเป็นไปได้


3
Bash script พร้อม `set -e` ไม่ได้หยุดอยู่ที่คำสั่ง` … && …… '
ฉันใช้set -eเพื่อหยุดทุบตีสคริปต์ในข้อผิดพลาดครั้งแรก ทำงานได้ดีทั้งหมดเว้นแต่ฉันจะใช้คำสั่งด้วย&&: $ cat script set -e cd not_existing_dir && echo 123 echo "I'm running! =P" $ $ ./script ./script: line 2: cd: not_existing_dir: No such file or directory I'm running! =P $ เมื่อเทียบกับ: $ cat script set -e cd not_existing_dir echo "I'm running! =P" $ $ ./script ./script: …

8
จะตรวจสอบว่าที่อยู่ IP ใด ๆ อยู่ในไฟล์โดยใช้เชลล์สคริปต์ได้หรือไม่
ฉันมีสคริปต์ที่สร้างผลลัพธ์บางอย่าง ฉันต้องการตรวจสอบผลลัพธ์สำหรับที่อยู่ IP ใด ๆ ที่ต้องการ 159.143.23.12 134.12.178.131 124.143.12.132 if (IPs are found in <file>) then // bunch of actions // else // bunch of actions // เป็นfgrepความคิดที่ดีหรือไม่? ฉันทุบตีใช้ได้
14 shell-script  grep  ip 

4
ฉันจะทำให้สคริปต์ใช้อาร์กิวเมนต์หลายตัวได้อย่างไร
นี่เป็นสคริปต์ที่ง่ายมาก #!/usr/local/bin/bash set -e if [ "$#" -lt 1 ] then echo "Please insert at least one argument" exit else echo -e "\c" fi if [ -h "$1" ] then echo "$1 is a symbolic link" else echo "$1 in not a symbolic link" fi ~ คำถามของฉันคือ: วิธีการเปลี่ยนสคริปต์สำหรับการรับรู้มากกว่า 1 ข้อโต้แย้ง? …

2
ลบไฟล์ที่เก่ากว่าไฟล์ที่ระบุ
ฉันจำเป็นต้องลบไฟล์ทั้งหมดที่เก่ากว่าไฟล์เฉพาะจากโฟลเดอร์ ใช้ bash บน CentOS 7 ฉันมีทางออกสำหรับสิ่งนี้ แต่ฉันคิดว่าควรมีวิธีที่หรูหรากว่านี้: reference_file=/my/reference/file get_modify_time() { stat $1 | grep -Po "Modify: \K[0-9- :]*" } pit=$(get_modify_time $reference_file) for f in /folder/0000* ; do [[ "$pit" > "$(get_modify_time $f)" ]] && rm $f ; done

4
จะเรียกใช้เชลล์ในตัวได้อย่างไร
ฉันต้องการปรับแต่งการทำงานของcdคำสั่งตามความต้องการของฉัน ฉันกำหนดหน้าที่ดังต่อไปนี้ - function cd () { cd "$@" && pushd "$@"; } ความตั้งใจของฟังก์ชั่นนี้คือการผลักดันไดเรกทอรีไปยังสแต็กโดยอัตโนมัติเพื่อให้ฉันไม่ต้องพยายามพิมพ์ด้วยตนเองpushd .ทุกครั้ง แต่ฟังก์ชั่นดังกล่าวข้างต้นเป็นฟังก์ชันเวียนเพียบเช่นการเรียกร้องให้cdมีการตีความว่าจะเป็นฟังก์ชั่นของตัวเองและไม่ได้cdในตัว ฉันจะอ้างอิงในcdตัวในฟังก์ชั่นนี้ได้อย่างไร \ฉันรู้ว่านามแฝงสามารถหนีออกมาใช้ เป็นวิธีการหลบหนีฟังก์ชั่นหรือการอ้างอิงในตัวในทางที่ชัดเจนมากขึ้นคืออะไร? หมายเหตุ: ฉันไม่ต้องการเปลี่ยนชื่อฟังก์ชั่นของฉันเป็นอย่างอื่น

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