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

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

3
เรียกใช้สคริปต์ในหน้าจอ
ฉันต้องการรันสคริปต์ทุบตีในหน้าจอเดี่ยว สคริปต์เรียกโปรแกรมสองสามครั้งแต่ละอันใช้เวลาในการรอนานเกินไป ความคิดแรกของฉันคือเพียงเปิดหน้าจอจากนั้นเรียกสคริปต์ แต่ดูเหมือนว่าฉันจะแยกออกไม่ได้ (โดยctrl-a d) ในขณะที่สคริปต์ทำงานอยู่ ดังนั้นฉันจึงทำการวิจัยและพบคำแนะนำนี้เพื่อแทนที่ shebang ด้วยต่อไปนี้: #!/usr/bin/screen -d -m -S screenName /bin/bash แต่นั่นไม่ได้ผลเช่นกัน (ตัวเลือกไม่ได้รับการยอมรับ) ข้อเสนอแนะใด ๆ ป.ล. เกิดขึ้นกับฉันในตอนนี้ซึ่งscreen -dmS name ./script.shอาจเป็นไปได้สำหรับวัตถุประสงค์ของฉัน แต่ฉันก็ยังสงสัยว่าจะรวมสิ่งนี้เข้ากับสคริปต์อย่างไร ขอขอบคุณ.

2
วิธีที่เร็วที่สุดในการเชื่อมไฟล์เข้าด้วยกัน
ฉันมีไฟล์ 10k + รวมกว่า 20GB ที่ฉันต้องต่อกันเป็นไฟล์เดียว มีวิธีที่เร็วกว่า cat input_file* >> out ? วิธีที่ต้องการจะเป็นคำสั่ง bash, Python เป็นที่ยอมรับเช่นกันหากไม่ช้ากว่านี้มาก
25 bash  shell-script  files  cat 

5
ชื่อสีขั้ว "เป็นมิตร" ในเชลล์สคริปต์?
ฉันรับรู้ถึงห้องสมุดในภาษาต่างๆเช่น Ruby และ Javascript เพื่อทำให้ colorizing script terminal ของคุณง่ายขึ้นโดยใช้ชื่อสีเช่น "red" แต่มีบางอย่างเช่นนี้สำหรับเชลล์สคริปต์ใน Bash หรือ Ksh หรืออะไรก็ตาม?

2
Bash scripting - loop จนกว่าค่าที่ส่งคืนจะเป็น 0
ฉันจำเป็นต้องติดตั้งบางสิ่งบางอย่างในสคริปต์ของฉัน แต่บางครั้งก็ยกเลิกการต่อเชื่อมก่อนที่ข้อมูลทั้งหมดจะถูกคัดลอกและทำให้การติดตั้งล้มเหลว ฉันมองหาวิธีที่จะทำการติดตั้ง "บล็อก" แต่ฉันไม่พบอะไรเลย ดังนั้นฉันพยายามเขียนสคริปต์เพื่อวนซ้ำจนกว่าจะสามารถ unmount ได้ แต่ไม่ได้ผล while [ `sudo umount mount` ] do sleep 0.1 done rmdir mount เมื่อรันเอาต์พุต: umount: /home/evantandersen/mount: device is busy. (In some cases useful info about processes that use the device is found by lsof(8) or fuser(1)) rmdir: failed to remove `mount': Device …

4
การเรียกใช้งานฟังก์ชั่นที่ผู้ใช้กำหนดในการค้นหา -exec call
ฉันใช้ Solaris 10 และฉันได้ทดสอบสิ่งต่อไปนี้ด้วย ksh (88), bash (3.00) และ zsh (4.2.1) รหัสต่อไปนี้ไม่ได้ให้ผลลัพธ์ใด ๆ : function foo { echo "Hello World" } find somedir -exec foo \; การค้นหาไม่ตรงกับหลายไฟล์ (ดังแสดงโดยแทนที่-exec ...ด้วย-print) และฟังก์ชั่นการทำงานอย่างสมบูรณ์แบบเมื่อถูกเรียกออกไปข้างนอกจากการfindโทร นี่คือสิ่งที่man findหน้าพูดเกี่ยวกับ-exec: คำสั่ง -exec จริงถ้าคำสั่งดำเนินการส่งกลับ ค่าศูนย์เป็นสถานะออก จุดจบของ คำสั่งจะต้องคั่นด้วยการหลบหนี อัฒภาค (;) อาร์กิวเมนต์คำสั่ง {} คือ แทนที่ด้วยชื่อพา ธ ปัจจุบัน หากว่า อาร์กิวเมนต์สุดท้ายของ -exec คือ …

4
การพิมพ์ข้อความสีโดยใช้เสียงสะท้อน
ฉันรู้ว่าสำหรับการพิมพ์ข้อความสีโดยใช้ echo เช่นสีแดงรหัสคือ: echo -e "\e[1;31m This is red text \e[0m" และฉันรู้ว่าในตัวอย่างนี้ 31 คือรหัสของสีแดงและจำนวนสีอื่น ๆ คือ: Black 0;30 Dark Gray 1;30 Blue 0;34 Light Blue 1;34 Green 0;32 Light Green 1;32 Cyan 0;36 Light Cyan 1;36 Red 0;31 Light Red 1;31 Purple 0;35 Light Purple 1;35 Brown 0;33 Yellow 1;33 …

3
$ # หมายถึงอะไรในเชลล์?
อะไร$#เฉลี่ยในเปลือก? ฉันมีรหัสเช่น if [ $# -eq 0 ] then ฉันต้องการเข้าใจความ$#หมาย แต่การค้นหาโดย Google นั้นแย่มากสำหรับการค้นหาสิ่งต่าง ๆ เหล่านี้

5
ฉันจะใช้วิธีทุบตีถ้าทดสอบและค้นหาคำสั่งด้วยกันได้อย่างไร
ฉันมีไดเรกทอรีที่มีบันทึกข้อผิดพลาดและฉันต้องการใช้คำสั่งแบบมีเงื่อนไขในสคริปต์ทุบตีตามคำสั่งค้นหา ไฟล์บันทึกจะถูกจัดเก็บในรูปแบบนี้: /var/log/crashes/app-2012-08-28.log /var/log/crashes/otherapp-2012-08-28.log ฉันต้องการให้คำสั่ง if ส่งคืนจริงถ้ามีบันทึกการทำงานล้มเหลวสำหรับแอปเฉพาะซึ่งได้รับการแก้ไขใน 5 นาทีที่ผ่าน findคำสั่งที่ผมจะใช้เป็น: find /var/log/crashes -name app-\*\.log -mmin -5 ฉันไม่แน่ใจว่าจะรวมเข้ากับifคำสั่งได้อย่างถูกต้อง ฉันคิดว่านี่อาจใช้งานได้: if [ test `find /var/log/crashes -name app-\*\.log -mmin -5` ] then service myapp restart fi มีบางพื้นที่ที่ฉันไม่ชัดเจน: ฉันดูที่ธง ifแต่ฉันไม่แน่ใจว่าควรใช้อันไหนถ้ามี ฉันต้องการtestคำสั่งหรือฉันควรประมวลผลผลลัพธ์ของคำสั่ง find โดยตรงหรืออาจใช้find... | wc -lเพื่อรับจำนวนบรรทัดแทน ไม่จำเป็น 100% ที่จะตอบคำถามนี้ แต่testสำหรับการทดสอบกับโค้ดส่งคืนที่คำสั่งส่งคืน? และพวกมันมองไม่เห็น - ด้านนอกของstdout/ stderr? …

2
ใช้สคริปต์ด้วย“ "และกับ" แหล่งที่มา "
ฉันสงสัยว่าสองวิธีต่อไปนี้ในการใช้งานสคริปต์ทุบตีนั้นเทียบเท่าหรือไม่ . ./myScript.sh source myScript.sh พวกเขาทั้งสองกำลังเรียกใช้เนื้อหาของสคริปต์แทนที่จะเรียกใช้สคริปต์เช่นไม่สร้าง subshell สำหรับเรียกใช้สคริปต์หรือไม่

4
เหตุใดตัวแปรภายในของฉันจึงอยู่ใน 'ขณะที่อ่าน' แต่ไม่ใช่ในวงอื่นที่คล้ายกัน
เหตุใดฉันจึงได้รับค่าต่าง ๆ$xจากตัวอย่างด้านล่าง #!/bin/bash x=1 echo fred > junk ; while read var ; do x=55 ; done < junk echo x=$x # x=55 .. I'd expect this result x=1 cat junk | while read var ; do x=55 ; done echo x=$x # x=1 .. but why? x=1 echo fred …

4
ฉันจะแทนที่ AND (&&) ในวง for ได้อย่างไร
ฉันต้องการหาสิ่งที่เทียบเท่า cmd 1 && cmd 2 && ... && cmd 20 แต่มีคำสั่งแสดงอยู่ภายในforลูปเช่น for i in {1..20} do cmd $i done คุณอยากแนะนำอะไรให้เปลี่ยนในนิพจน์ที่สองเพื่อหาค่าที่เท่ากัน

2
การเปลี่ยนเส้นทางเอาต์พุตของ grep ไปยัง / dev / null คืออะไร
พิจารณาบรรทัดนี้: ${libdir}/bin/licenseTool check "${SERIAL}" "${VERSION}" "${PRODUCT}" ${libdir} | grep '^200' >/dev/null อะไรคือจุดของการมองหาลวดลายในผลลัพธ์ถ้าผลลัพธ์นั้นถูกโยนทิ้งไป? และหากบรรทัดเช่นนั้นปรากฏขึ้นเป็นสิ่งสุดท้ายในสคริปต์ทุบตีค่าการออกของมันจะถูกส่งกลับไปยังผู้เรียกของสคริปต์หรือถูกละเว้น? (ฉันคาดเดาได้ว่าเราสามารถสันนิษฐานได้ว่าสิ่งนี้ทำเพื่อผลข้างเคียงเท่านั้นหรือส่งคืนบางสิ่งบางอย่างแก่ผู้โทร)

2
อะไรคือสิ่งที่เทียบเท่ากับ zsh ของ bash's export -f
zshดังนั้นผมจึงเริ่มใช้ ฉันชอบมันทั้งหมด ดูเหมือนดีมากและลื่นไหลและความจริงที่ว่าไดเรกทอรีการทำงานปัจจุบันและบรรทัดคำสั่งจริงนั้นอยู่ในบรรทัดที่ต่างกันเป็นสิ่งที่ดี แต่ในเวลาเดียวกันฉันสังเกตเห็นว่าzshอาจช้ากว่าเล็กน้อยbashโดยเฉพาะเมื่อพิมพ์ข้อความไปที่ จอภาพ สิ่งที่ผมชอบมากที่สุดคือข้อเท็จจริงที่ว่าzshคือ .bashrc'เข้ากันได้กับทุกฟังก์ชั่นที่ผมกำหนดไว้ในของฉัน หนึ่งจับแม้ว่า ฟังก์ชั่นทำงานได้อย่างสมบูรณ์แบบ แต่ฉันไม่สามารถเข้าใจได้ว่าระบบส่งออกทำงานอย่างไร ฉันได้บางส่วนของผู้ฟังก์ชั่นการส่งออกเพื่อที่ฉันจะใช้พวกเขาที่อื่นเช่นในสคริปต์และโปรแกรมภายนอกด้วย.bashrcexport -f ใน zsh การส่งออกดูเหมือนจะไม่ได้พูดคุยด้วยซ้ำ การโหลดอัตโนมัติหรือไม่ สองสิ่งนั้นเหมือนกันหรือไม่ ฉันมีเวลายากที่จะหามัน

8
ฉันจะผนวกข้อความไปยังจุดเริ่มต้นและจุดสิ้นสุดของไฟล์ข้อความหลายไฟล์ใน Bash ได้อย่างไร
ฉันมีไดเรกทอรีที่เต็มไปด้วยไฟล์ข้อความ เป้าหมายของฉันคือเพิ่มข้อความต่อท้ายและท้ายข้อความทั้งหมด ข้อความที่ไปที่จุดเริ่มต้นและจุดสิ้นสุดนั้นเหมือนกันสำหรับแต่ละไฟล์ ขึ้นอยู่กับรหัสที่ฉันได้รับจากเว็บนี่คือรหัสสำหรับต่อท้ายไฟล์: echo -e 'var language = {\n$(cat $BASEDIR/Translations/Javascript/*.txt)' > $BASEDIR/Translations/Javascript/*.txt นี่คือรหัสสำหรับการผนวกท้ายไฟล์ เป้าหมายคือการเพิ่มข้อความ};ที่ส่วนท้ายของแต่ละไฟล์: echo "};" >> $BASEDIR/Translations/Javascript/*.txt ตัวอย่างที่ฉันวาดมานั้นมีไว้สำหรับการแสดงในแต่ละไฟล์ ฉันคิดว่าฉันพยายามทำหน้าที่ในหลาย ๆ *.txtไฟล์โดยใช้สัญลักษณ์แทน, ฉันอาจทำผิดพลาดอื่น ๆ เช่นกัน ไม่ว่าในกรณีใดฉันจะต่อท้ายข้อความไปยังจุดเริ่มต้นและจุดสิ้นสุดของไฟล์หลาย ๆ ไฟล์ได้อย่างไร

3
ในสคริปต์ bash shell ให้เขียน a for loop ที่วนซ้ำค่าสตริง
ใน bash ฉันรู้ว่ามันเป็นไปได้ที่จะเขียนforloop ซึ่งตัวแปรควบคุมการiวนซ้ำนั้นวนซ้ำตามจำนวนเต็มที่ระบุ ตัวอย่างเช่นฉันสามารถเขียน bash shell script ที่พิมพ์จำนวนเต็มระหว่าง 1 ถึง 10: #!/bin/bash for i in {1..10} do echo $i done เป็นไปได้หรือไม่ที่จะวนซ้ำตัวแปรการควบคุมลูปที่เป็นสตริงแทนถ้าฉันจัดเตรียมรายการสตริง? ตัวอย่างเช่นสมมติว่าฉันมีสตริงfnameที่แสดงชื่อไฟล์ ฉันต้องการเรียกชุดคำสั่งสำหรับแต่ละชื่อไฟล์ ตัวอย่างเช่นฉันอาจต้องการพิมพ์เนื้อหาของการfnameใช้คำสั่งเช่นนี้: #!/bin/bash for fname in {"a.txt", "b.txt", "c.txt"} do echo $fname done กล่าวอีกนัยหนึ่งในการทำซ้ำครั้งแรกfnameควรมีค่าfname="a.txt"ในขณะที่การทำซ้ำครั้งที่สองfnameควรมีค่าfname="b.txt"และอื่น ๆ น่าเสียดายที่ดูเหมือนว่าไวยากรณ์ข้างต้นไม่ถูกต้องนัก ฉันต้องการได้รับผลลัพธ์: a.txt b.txt c.txt แต่เมื่อฉันลองรหัสข้างต้นฉันได้ผลลัพธ์นี้: {a.txt, b.txt, c.txt} คุณช่วยฉันในการกำหนดไวยากรณ์ที่ถูกต้องเพื่อที่ฉันจะสามารถเปลี่ยนค่า / เนื้อหาของตัวแปรได้fnameหรือไม่? …
24 bash  shell-script  for 

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