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

คำถามเฉพาะของ Bourne อีกครั้งของเชลล์ใน GNU เมื่อเทียบกับเชลล์ Bourne / POSIX อื่น ๆ สำหรับคำถามเกี่ยวกับเชลล์ Unix โดยทั่วไปให้ใช้ / เชลล์แท็กแทน

4
รหัสไฮบริดในเชลล์สคริปต์ การแชร์ตัวแปร
คำตอบนี้กล่าวถึงวิธีการเรียกใช้ข้อมูลโค้ด Python หลายบรรทัดจากบรรทัดคำสั่งในเทอร์มินัล ฉันสังเกตว่าคำตอบนั้นใช้งานได้ดีในเชลล์สคริปแม้จะมีการเยื้องซ้อนกันซึ่งดีมากเช่น #!/bin/bash some_text="Hello world" echo $some_text cat <<EOF | python - import sys; for r in range(3): print r for a in range(2): print "hello" EOF พิมพ์: 0 hello hello 1 hello hello 2 hello hello อย่างไรก็ตามฉันมีช่วงเวลาที่ยากลำบากในการแชร์ตัวแปรระหว่างเชลล์สคริปต์และข้อมูลโค้ดของ Python ฉันจะรวบรวมเอาต์พุตของตัวห้อย python ในสคริปต์ทุบตีได้อย่างไร (เช่นในตัวแปรเช่น$output) ฉันจะส่งตัวแปร bash (เช่น$some_text) ไปยังสคริปต์ Python …
10 bash  scripting  zsh  python 

3
นิพจน์ทั่วไปสำหรับค้นหาอักขระสองตัวใน Bash
ฉันกำลังมองหานิพจน์ทั่วไปที่ค้นหาการเกิดขึ้นของอักขระสองตัวในข้อความรายชื่อและอื่น ๆ บนบรรทัดคำสั่ง (Bash) หลักคำถาม : มีวิธีง่ายๆในการมองหาลำดับเช่นaa, ll, tttttฯลฯ ที่หนึ่งกำหนดนิพจน์ปกติที่จะมองหาที่ปรากฏ n ของตัวละครเดียวกันด้วย? สิ่งที่ฉันกำลังมองหาคือการบรรลุเป้าหมายในระดับพื้นฐานมาก ๆ บนบรรทัดคำสั่ง ใน Linux Shell หลังจากงานวิจัยบางอย่างฉันมาถึงคำตอบต่อไปนี้ - และคำถามที่เกิดจากพวกเขาดังนั้นพวกเขาเพียงแค่ให้คำแนะนำแก่ฉันว่าคำตอบอาจอยู่ที่ใด แต่: ก) (e) grep และปัญหาแบ็กสแลช grep 'a\{2\}' มองหา aa egrep'a{2}' มองหา aa คำถาม: ความจำเป็นของการตั้ง backlashes นั้นผูกพันกับคำสั่งที่ฉันใช้หรือไม่? ถ้าเป็นเช่นนั้นทุกคนสามารถให้คำแนะนำฉันกับฉันได้อย่างไรเมื่อใช้ (e) grep ที่นี่? b) ฉันพบคำตอบนี้ที่นี่สำหรับคำถามของฉันแม้ว่าจะไม่ใช่สิ่งที่ฉันกำลังมองหา: grep -E '(.)\1' filenameมองหารายการที่มีลักษณะเดียวกันที่ปรากฏมากกว่าหนึ่งครั้ง แต่ไม่ได้ถามบ่อยแค่ไหน ใกล้กับสิ่งที่ฉันกำลังมองหา แต่ฉันยังต้องการตั้งค่าการทำซ้ำจำนวนมาก …


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 …

5
การจับคู่รูปแบบกับชื่อพา ธ ใน bash
ฉันต้องการดำเนินการกับรายการไดเรกทอรีย่อยในไดเรกทอรี พิจารณา: for x in x86-headers/*/C/populate.sh; do echo $x; done สิ่งนี้จะช่วยให้ x86-headers/elf/C/populate.sh x86-headers/gl/C/populate.sh x86-headers/gmp/C/populate.sh x86-headers/gnome2/C/populate.sh x86-headers/gtk2/C/populate.sh x86-headers/jni/C/populate.sh x86-headers/libc/C/populate.sh แต่ฉันต้องการค่าที่สอดคล้องกับส่วนที่สองของเส้นทาง elf, glฯลฯ x86-headersฉันรู้วิธีการเปลื้องผ้าชั้นนำ for x in x86-headers/*/C/populate.sh; do i=${x##x86-headers/}; echo $i; done ซึ่งจะช่วยให้ elf/C/populate.sh gl/C/populate.sh gmp/C/populate.sh gnome2/C/populate.sh gtk2/C/populate.sh jni/C/populate.sh libc/C/populate.sh ฉันรู้วิธีถอดคำศัพท์ในภายหลังในเส้นทางด้วย เช่นลงไปหนึ่งระดับ: cd x86-headers for x in */C/populate.sh; do i=${x%%/*}; echo …

2
เหตุใด $ '\ 0' จึงเหมือนกับ ''
วิธีทั่วไปในการทำสิ่งต่าง ๆ ที่มีไฟล์อยู่สองไฟล์คือ - และอย่าไปทำอย่างนั้นกับฉัน: for f in $(ls); do … ตอนนี้เพื่อความปลอดภัยต่อไฟล์ที่มีช่องว่างหรือตัวอักษรแปลก ๆ วิธีการที่ไร้เดียงสาจะทำ: find . -type f -print0 | while IFS= read -r -d '' file; … ที่นี่-d ''เป็นระยะสั้นสำหรับการตั้งค่า NUL ASCII -d $'\0'กับใน แต่ทำไมถึงเป็นเช่นนั้น? ทำไม''และ$'\0'เหมือนกัน นั่นเป็นเพราะราก C ของ Bash ที่มีสตริงว่างจะถูกยกเลิกด้วยค่าว่างเสมอหรือไม่?
10 bash 

2
จัดการชื่อไฟล์ piped จากคำสั่ง find
ฉันค่อนข้างใหม่กับ Bash และฉันพยายามทำบางสิ่งที่บนพื้นผิวนั้นค่อนข้างตรงไปตรงมา - ลองค้นหาลำดับชั้นของไดเรกทอรีเพื่อรับไฟล์ * .wma ทั้งหมดไปป์ที่เอาต์พุตไปยังคำสั่งที่ฉันแปลงเป็น mp3 และ บันทึกไฟล์ที่แปลงเป็น. mp3 ฉันคิดว่าคำสั่งควรมีลักษณะดังต่อไปนี้ (ฉันได้ละทิ้งคำสั่งการแปลงเสียงและฉันใช้ echo แทนภาพประกอบ): $ find ./ -name '*.wma' -type f -print0 | xargs -0 -I f echo ${f%.*}.mp3 ตามที่ฉันเข้าใจแล้ว -print0 arg จะให้ฉันจัดการกับชื่อไฟล์ที่มีช่องว่าง ฉันคาดหวังว่า (เนื่องจาก xargs) ว่าแต่ละพา ธ ไฟล์จาก find ถูกดักจับใน f และการใช้ซับสตริงจับคู่ / ลบจากจุดสิ้นสุดของสตริงนั้นฉันควรจะสะท้อนพา ธ ไฟล์ดั้งเดิมด้วย mp3 …

4
รายการไฟล์ / ไบนารีทั้งหมดใน PATH ปัจจุบัน
มีวิธี "ใช้ง่าย" ในการรันคำสั่งลักษณะ "ls -la" สำหรับการแสดงรายการไฟล์ทั้งหมด / ไบนารีที่ปฏิบัติการได้ใน PATH ปัจจุบันหรือไม่? (ฉันตั้งใจที่จะไพพ์เอาต์พุตเป็น grep สำหรับการค้นหาคำสั่งที่ไม่รู้จักคำนำหน้า แต่รู้จักกันโดยทั่วไปว่า "ชื่อ" ชนิดของกรณีเมื่อการเติมข้อมูลอัตโนมัติ / การแท็บในทุบตีนั้นไม่มีประโยชน์ คุณสมบัติที่สมบูรณ์ "... )
10 bash  ls  path  autocomplete 

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

2
ไฮไลต์สามไฟล์ที่อัพเดตล่าสุดในเอาต์พุต ls
มีวิธีใดที่จะโอเวอร์โหลดหรือปิดlsคำสั่งเพื่อให้ไฮไลต์ / ขีดเส้นใต้ / มิฉะนั้นจะทำให้ไฟล์สามไฟล์ที่ผ่านการแก้ไขมีความชัดเจนหรือไม่? ฉันรู้ว่าฉันสามารถls -rtlสั่งซื้อได้ตามเวลาการแก้ไขแบบย้อนกลับ แต่ฉันมักจะต้องการรายชื่อเรียงตามตัวอักษรของไฟล์แม้ว่าฉันจะต้องการระบุไฟล์ล่าสุดที่ตนเองหรือผู้อื่นดัดแปลงอย่างรวดเร็ว
10 linux  bash  command-line  ls 

5
คุณจะปรับสีคำหลักบางคำสำหรับสคริปต์ทุบตีได้อย่างไร
ฉันใช้รหัสการทดสอบหน่วย โค้ดทดสอบหน่วยจะแสดงข้อความปกติ มีข้อความจำนวนมากดังนั้นฉันต้องการเน้นสำหรับคำหลักที่สำคัญของผู้ใช้ ในกรณีนี้คำหลักคือ "PASS" และ "FAIL" คุณเปลี่ยนสี "PASS" เป็นสีเขียวและ "FAIL" เป็นสีแดงได้อย่างไร

3
ใช้ here-doc สำหรับ `sed 'และไฟล์
ฉันต้องการใช้ here-doc สำหรับคำสั่ง sed และจัดเตรียมไฟล์ที่จะอ่านและไฟล์เอาต์พุต ฉันดูที่นี่ - เอกสารจากคู่มือการสคริปต์การทุบตีขั้นสูง แต่ไม่ได้พูดถึงสิ่งใดเกี่ยวกับอาร์กิวเมนต์ปกติในการใช้ here-doc เป็นไปได้ไหม ฉันต้องการบรรลุสิ่งต่อไปนี้: #!/bin/bash OUT=/tmp/outfile.txt IN=/my_in_file.txt sed $IN << SED_SCRIPT s/a/1/g s/test/full/g SED_SCRIPT > $OUT; ความช่วยเหลือใด ๆ ที่เป็นที่นิยมจริงๆ

3
ป้อนข้อความโดยอัตโนมัติจากสคริปต์ทุบตีโดยไม่ต้องใช้ EOF
ฉันใช้ Ubuntu Linux myprogramสมมติว่ามีโปรแกรมที่เรียกว่า โปรแกรมนี้ให้ผู้ใช้ป้อนข้อมูล Enterโดยเฉพาะผู้ใช้ต้องพิมพ์เป็นจำนวนเต็มเมื่อได้รับแจ้งและกด ฉันต้องการทำให้กระบวนการนี้เป็นแบบอัตโนมัติโดยใช้สคริปต์ทุบตี โดยเฉพาะอย่างยิ่งฉันต้องการที่จะดำเนินการmyprogramพูด 100 ครั้ง (ใช้เคาน์เตอร์iที่ไปจาก1ไป100) ในการดำเนินการแต่ละครั้งmyprogramฉันต้องการป้อนค่าปัจจุบันของiเมื่อได้รับแจ้ง (โดยวิธีการmyprogramใช้ตัวเลือก / สวิทช์-optionsซึ่งทั้งหมดจะคงที่และระบุไว้ในสคริปต์ทุบตี) โครงกระดูกที่ไม่สมบูรณ์ของสคริปต์ทุบตีนี้อาจเป็น: #!/bin/bash for i in {1..100} do myprogram -options done ตอนนี้ฉันต้องการแก้ไขโค้ดด้านบนเพื่อให้iป้อนค่าปัจจุบันของเมื่อได้รับแจ้งจากโปรแกรม วิธีที่ดีที่สุดในการทำเช่นนี้คืออะไร? เว็บไซต์ของซอฟต์แวร์ที่ฉันใช้แนะนำให้ใช้<<EOFที่ท้ายmyprogram -optionsบรรทัด ฉันคิดว่าสิ่งนี้บอกให้ทุบตีดูที่ "จุดสิ้นสุดของไฟล์" สำหรับอินพุตที่จะใช้ แต่ถ้าฉันไม่ต้องการวางอินพุตที่ท้ายไฟล์ล่ะ เกิดอะไรขึ้นถ้าผมอยากจะใส่มันทันทีหลังจากที่<<หรือ<? เหตุผลก็คือสิ่งต่าง ๆ จะมีความซับซ้อนมากขึ้น ตัวอย่างเช่นฉันอาจแนะนำตัวนับจำนวนเต็มที่jเปลี่ยนแปลงในวิธีที่ไม่เป็นเชิงเส้นหรือไม่ต่อเนื่อง จากนั้นผมก็อยากจะกินค่าปัจจุบันของjไปmyprogramในแต่ละซ้ำ แต่ค่าของjอาจมีการเปลี่ยนแปลงระหว่างการโทรไปและจุดสิ้นสุดของแฟ้ม myprogram -optionsEOF คุณมีข้อเสนอแนะใด?

5
มีเว็บไซต์ทดสอบสคริปต์ทุบตีออนไลน์หรือไม่
บางครั้งฉันต้องการช่วยเหลือเพื่อนด้วยการทุบตีสคริปต์ เมื่อฉันใช้เครื่อง Windows มันเป็นสภาพแวดล้อมการทำงานและฉันไม่สามารถตั้งค่า Cygwin หรือใช้ VM ได้ มีเว็บไซต์สคริปต์ฟรีที่ฉันสามารถใช้ได้โดยเฉพาะอย่างยิ่งที่ฉันสามารถใช้ Putty เพื่อเชื่อมต่อหรือสิ่งที่คล้ายกัน?
10 bash 

4
ลบไฟล์ที่เก่ากว่า 5 วันใน UNIX (วันที่ในชื่อไฟล์ไม่ใช่เวลาประทับ)
ฉันต้องการลบไฟล์บันทึกที่เก่ากว่า 5 วันจากไดเรกทอรี แต่การลบไม่ควรยึดตามเวลาประทับของไฟล์ มันควรจะขึ้นอยู่กับชื่อของไฟล์ สำหรับวันที่ตัวอย่างในปัจจุบันเป็น 2012/07/05 และไดเรกทอรีมี 10 ไฟล์ชื่อเช่นABC_20120430.log, ABC_20120429.log, ABC_20120502.log, ABC_20120320.logฯลฯ ฉันต้องการที่จะสามารถที่จะลบไฟล์โดยแยกวันจากชื่อของไฟล์
10 bash  sed  rm 

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