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

การทำสคริปต์ Bash กำลังสร้างสคริปต์ในภาษา Bash shell

2
รับเส้นทางแบบเต็มไปยังเป้าหมายของลิงก์ได้อย่างไร
ถ้ามีการเชื่อมโยงสัญลักษณ์ที่สร้างขึ้นด้วย/var/opt/foo ln -fs /path/to/target/dir fooฉันสามารถในสคริปต์ที่เห็นเพียงการเชื่อมโยงได้รับการ/path/to/target/dir? สิ่งที่ฉันต้องการที่จะประสบความสำเร็จในสคริปต์ก่อนที่ผมจะทำrm -rf /path/to/target/dirln -fs /path/to/another/dir foo

2
ข้อแตกต่างเมื่อใช้ backticks ในเครื่องหมายคำพูดคู่และเครื่องหมายคำพูดเดี่ยวใน Bash
ทำไมการประมวลผลสองรายการต่อไปนี้จึงแตกต่างกันในเอาต์พุต (ฉันต้องการอัญประกาศคู่สำหรับตัวแปรในคำสั่งในที่สุดของฉัน) $ sudo su -c "echo `cat /root/root_file`" cat: /root/root_file: Permission denied $ sudo su -c 'echo `cat /root/root_file`' Yay, highly classified content!

2
เหตุใดจึงไม่ทุบตีในขณะที่ออกจากวงเมื่อท่อไปที่คำสั่งย่อยที่ถูกยกเลิก?
ทำไมคำสั่งด้านล่างจึงไม่ออก? แทนที่จะออกจากการวนซ้ำจะวิ่งไปเรื่อย ๆ ในขณะที่ฉันค้นพบพฤติกรรมนี้โดยใช้การตั้งค่าที่ซับซ้อนมากขึ้นรูปแบบที่ง่ายที่สุดของคำสั่งจะลดลงไปดังต่อไปนี้ ไม่ออก: while /usr/bin/true ; do echo "ok" | cat ; done | exit 1 ไม่มีการพิมพ์ผิดด้านบน แต่ละ '|' เป็นท่อ 'ทางออก 1' ย่อมาจากกระบวนการอื่นที่วิ่งและออก ฉันคาดว่า "exit 1" จะทำให้เกิด SIGPIPE ในขณะที่ลูป (เขียนบนไพพ์ที่ไม่มีตัวอ่าน) และเพื่อให้ลูปแตกออก แต่การวนซ้ำยังคงทำงานอยู่ เหตุใดคำสั่งจึงไม่หยุด

2
วิธีรับรายการกระบวนการลูกทั้งหมดที่เกิดจากสคริปต์
บริบท: ผู้ใช้ระบุสคริปต์ที่กำหนดเองเพื่อเรียกใช้ สคริปต์เหล่านี้อาจเป็นประเภทใด ๆ เช่นสคริปต์เพื่อเริ่มโปรแกรม GUI หลาย ๆ บริการแบ็กเอนด์ ฉันไม่สามารถควบคุมวิธีการเขียนสคริปต์ได้ สคริปต์เหล่านี้สามารถเป็นประเภทการบล็อกเช่นการดำเนินการรอจนกว่ากระบวนการลูกทั้งหมด (โปรแกรมที่ทำงานตามลำดับ) ออก #exaple of blocking script echo "START" first_program second_program echo "DONE" หรือประเภทการปิดกั้นที่ไม่ใช่ประเภทที่แยกเด็กกระบวนการในพื้นหลังและออกจากสิ่งที่ชอบ #example of non-blocking script echo "START" first_program & second_program & echo "DONE" ฉันพยายามทำอะไรให้สำเร็จ ผู้ใช้ให้สคริปต์สามารถเป็นหนึ่งในสองประเภทข้างต้นหรือผสมกันทั้งสอง งานของฉันคือเรียกใช้สคริปต์และรอจนกว่ากระบวนการทั้งหมดที่เริ่มต้นโดยจะออกจากนั้นปิดโหนด หากเป็นประเภทการบล็อกกรณีง่าย ๆ คือรับ PID ของกระบวนการดำเนินการสคริปต์และรอจนกระทั่ง ps -ef | grep -ef PID …


1
การโต้ตอบอัตโนมัติกับ Google Chrome
เอาล่ะ SU ฉันมีความสนุกที่จะแตก ฉันมีการตั้งค่าหน้าจอทั้งหมด 8 จอโดยทั้งหมดติดอยู่ใน G5 เนื้อเดียวที่ใช้ Snow Leopard (ใช่การ์ดกราฟิก 4 ตัวความกว้าง 15,000 พิกเซล) ฉันกำลังตั้งค่าการสาธิตซึ่งใช้หน้าต่างเบราว์เซอร์ Chrome แบบเต็มหน้าจอ 8 ตัวแต่ละอันชี้ไปที่ URL อื่น มันเป็นความเจ็บปวดในตูดที่จะทำสิ่งนี้ด้วยตนเองทุกครั้งที่รีสตาร์ทคอมพิวเตอร์ เมื่อตั้งค่านี้ฉันต้องการเขียนสคริปต์โดยอัตโนมัติ: เปิดหน้าต่าง Chrome ไปที่หน้าจอเฉพาะ ชี้หน้าต่างนั้นไปยัง URL เฉพาะ หน้าต่างเต็มหน้าจอ (command-F เป็นแป้นพิมพ์ลัด) ฉันไม่ได้ใช้ระบบออโตเมติกและฉันไม่คุ้นเคยกับการเขียนสคริปต์เชลล์โดยเฉพาะ แต่ฉันสงสัยว่ามีคำแนะนำที่แปลกใหม่จากฝูงชนหรือไม่ อัปเดต:แม้ว่าฉันจะต้องใช้ Automator สำหรับฟังก์ชั่นระดับสูงในที่สุดฉันก็หวังว่าจะมีวิธีเรียกสคริปต์จากบรรทัดคำสั่ง / สคริปต์ ฉันต้องการที่จะสามารถเปิดการสาธิตนี้จากระยะไกลหากจำเป็น

4
วิธีคืนค่าการตั้งค่าอย่างถูกต้องเมื่อเรียกใช้สคริปต์โดยใช้“ แหล่งที่มา”
ฉันกำลังเขียนสคริปต์ที่ต้องดำเนินการโดยใช้sourceเพราะหน้าที่ของมันคือการแก้ไขสภาพแวดล้อม ในระหว่างสคริปต์ฉันต้องการใช้set -eเพื่อให้ข้อผิดพลาดใด ๆ หยุดสคริปต์ สคริปต์มีลักษณะดังนี้: #!/bin/bash set -e # do something cd somewhere source anotherScript ปัญหาคือว่าset -eยังคงมีผลตามธรรมชาติหลังจากสคริปต์เสร็จสิ้น ฉันจะมั่นใจได้อย่างไรว่าsetตัวเลือกที่เปลี่ยนแปลงนั้นได้รับการคืนค่าอย่างเหมาะสมเมื่อสคริปต์หยุดทำงาน (ไม่ว่าด้วยวิธีใด - โดยการดำเนินการให้สำเร็จหรือเกิดข้อผิดพลาด)

1
จะทำให้ sed ไม่ตัดบรรทัดที่ไม่ตรงกันได้อย่างไร
ในตัวอย่างต่อไปนี้sedจับคู่บรรทัดที่ขึ้นต้นด้วยaหรือหรือcและพิมพ์อักขระตัวแรกของบรรทัดนั้น ( aหรือc): $ echo "ag bh ci dj ek fl" | sed 's/\(a\|c\)./\1/' # Matches lines starting with 'a' or 'c'. output: a bh c dj ek fl อย่างไรก็ตามบรรทัดที่ไม่ตรงกับรูปแบบจะถูกพิมพ์ออกมาเช่นกัน ฉันจะบอกsedให้ละเว้นบรรทัดที่ไม่ตรงกับรูปแบบได้อย่างไร ฉันสามารถรับเอฟเฟกต์ที่ต้องการได้โดยรวมเข้ากับgrep(ดังต่อไปนี้) แต่ฉันอยากจะรู้ว่าsedสามารถบรรลุ "ด้วยตัวเอง" ได้หรือไม่ $ echo "ag bh ci dj ek fl" | grep '[ac]' | sed 's/\(a\|c\)./\1/' output: …

3
ฉันจะใช้คำสั่งใดในการสร้างกระบวนการลูกสองกระบวนการตามลำดับ
ฉันต้องการที่จะวางไข่กระบวนการเด็กสองกระบวนการ แต่รอจนกว่าจะถึงจุดแรกในการดำเนินการของมัน (ซึ่งสามารถกำหนดได้โดยการตรวจสอบ stdout) ก่อนวางไข่ที่สอง ฉันไม่แน่ใจว่าคำสั่ง unix ใดที่จะเกี่ยวข้องกับการทำสิ่งนี้ให้สำเร็จและได้ยากในการค้นหาสิ่งใดผ่านทาง google เนื่องจากคำย่อและบางครั้งอาจเป็นความลับของชื่อคำสั่ง unix ฉันไม่ได้กำลังหาทางแก้ไขปัญหาเฉพาะที่ฉันกำลังพยายามแก้ไข (แม้ว่าจะมีคำแนะนำเพิ่มเติมใด ๆ ก็ตาม) ฉันก็กังวลเป็นอย่างมากเกี่ยวกับการรู้ว่าคำสั่ง unix ใดที่ฉันต้องการค้นหาและเรียนรู้การใช้

2
เขียน n ไบต์จากไฟล์หนึ่งไปอีกอันหนึ่งใน Bash
สวัสดีฉันจะเขียนnไบต์จากไฟล์หนึ่งไปเป็นไฟล์ใหม่โดยเริ่มจากkตำแหน่งโดยใช้ Bash ได้อย่างไร ตัวอย่างเช่นถ้า n = 60, k = 1 และขนาดไฟล์ = 100 ดังนั้น: ไฟล์ที่ 2 จะประกอบด้วยตั้งแต่ไบต์ที่ 1 จนถึง 60 ไบต์และจะมีขนาด 60 ไบต์ ตัวอย่างเช่นถ้า n = 40, k = 61 และขนาดไฟล์ = 100 ดังนั้น: ไฟล์ที่ 2 จะประกอบด้วยตั้งแต่ 61st ไปจนถึง 100 ไบต์และจะมีขนาด 40 ไบต์ อาจเป็นไปได้ว่าเรากำลังทำงานกับไฟล์ไบนารีไม่ใช่ไฟล์ ASCII ดังนั้นการต่อข้อมูล 2 ส่วนควรจะเหมือนกับไฟล์ต้นฉบับ! (เป็นไปได้ด้วยddหรือไม่)

1
รับชื่อไฟล์โดยไม่มีนามสกุลใน Bash
ฉันมีดังต่อไปนี้ for วนเป็นรายบุคคล sort ไฟล์ข้อความทั้งหมดที่อยู่ในโฟลเดอร์ (เช่นสร้างไฟล์เอาต์พุตที่เรียงลำดับสำหรับแต่ละไฟล์) for file in *.txt; do printf 'Processing %s\n' "$file" LC_ALL=C sort -u "$file" > "./${file}_sorted" done มันเกือบจะสมบูรณ์แบบยกเว้นว่ามันจะส่งออกไฟล์ในรูปแบบของ: originalfile.txt_sorted ... ในขณะที่ฉันต้องการส่งออกไฟล์ในรูปแบบ: originalfile_sorted.txt นี่เป็นเพราะ ${file} ตัวแปรมีชื่อไฟล์รวมถึงส่วนขยาย ฉันใช้ Cygwin บน Windows ฉันไม่แน่ใจว่าสิ่งนี้จะทำงานได้อย่างไรในสภาพแวดล้อม Linux จริง แต่ใน Windows ส่วนขยายที่เปลี่ยนไปนี้ทำให้ Windows Explorer ไม่สามารถเข้าถึงไฟล์ได้ ฉันจะแยกชื่อไฟล์จากส่วนขยายเพื่อให้สามารถเพิ่มได้อย่างไร _sorted คำต่อท้ายระหว่างทั้งสองทำให้ฉันสามารถแยกความแตกต่างของรุ่นดั้งเดิมและไฟล์ที่เรียงลำดับได้อย่างง่ายดายในขณะที่ยังคงนามสกุลไฟล์ของ Windows ไว้เหมือนเดิม? ฉันกำลังดูอะไร อาจ …

2
ฉันจะเชื่อมสตริงจากรายการในสคริปต์ทุบตีได้อย่างไร
ตัวอย่างเช่น: List="A B C D" for I in $List do OUT=$OUT" -$I" done เมื่อฉันเรียกใช้ผลลัพธ์นี้คือ: " -A -B -C -D" แต่ต้องการเป็น: "-A -B -C -D" ฉันจะต่อกันได้โดยไม่ต้องนำหน้า? btw นี้เป็นรายการอาร์กิวเมนต์ของสคริปต์

3
วิธีที่จะได้รูปแบบจากไฟล์
ฉันมีสองไฟล์หนึ่งเก็บรายการของรูปแบบอื่นต้องเปลี่ยนตามรูปแบบเหล่านี้ จนถึงตอนนี้ฉันได้ทำการทดลองกับ cat patterns.txt| xargs -n1| sed 's/patternfromfile/subtitution/' แต่ฉันไม่แน่ใจว่าจะป้อน xargs ลงใน 's / here //' ได้อย่างไร ขอบคุณ

2
สับสนเกี่ยวกับ jq parser
ฉันพยายามใช้ ตัวแยกวิเคราะห์ jq ในสคริปต์ทุบตีของฉันและฉันสับสนเกี่ยวกับวิธีการทำงานบางคนสามารถอธิบายสิ่งที่ฉันทำผิดหรือเปล่า? นี่คือไฟล์ต้นฉบับจากบริการภายนอกและฉันต้องได้รับ value จากมัน: root@test ~ # cat test.json {"sensors":[{"id":34585,"value":-3.06,"time":1457031003}]} พยายามส่งไปที่ jq: root@test ~ # cat narod.json | jq { "sensors": [ { "id": 34585, "value": -3.06, "time": 1457031003 } ] } พยายามที่จะรับ sensors: root@test ~ # cat narod.json | jq '.sensors' [ { "id": 34585, "value": …

3
เหตุใดสคริปต์นี้จึงไม่ทำงาน
ฉันใช้สคริปต์ทุบตีนี้: for i in $(ls); do mv $i a$i; done เพื่อเติมชื่อไฟล์ทั้งหมดในโฟลเดอร์ด้วยตัวอักษร a ฉันกลัวว่าในบางครั้งฉันจะใช้สคริปต์นี้ในไดเรกทอรีที่ไม่ถูกต้องและเติมชื่อไฟล์จำนวนมากที่ฉันไม่ต้องการให้มีการเติม ดังนั้นฉันจึงตัดสินใจอ้างอิงเส้นทางไปยังไฟล์อย่างชัดเจน ดังนั้นตอนนี้สคริปต์ของฉันจะเป็นดังนี้: for i in $(ls /cygdrive/c/Users/path/to/Images); do mv /cygdrive/c/Users/path/to/Images/$i /cygdrive/c/Users/path/to/Images/a$i; done มันเติมชื่อไฟล์ด้วยตัวอักษร a แต่ต่อท้ายชื่อไฟล์ด้วยสัญลักษณ์นี้ ความคิดใด ๆ ว่าทำไมมันจะทำเช่นนั้น? หากมีสิ่งใดช่วยฉันใช้ cygwin ในกล่อง Windows 7 ขอบคุณสำหรับความช่วยเหลือ!

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