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

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

5
ต้องการวนรอบการนอนหลับเป็นเสี้ยววินาที
ในเครื่องของฉันฉันต้องดำเนินการรอบที่วนซ้ำ 1 คำสั่งง่ายๆที่จะต้องมีความล่าช้าแสดงในเสี้ยววินาที สมมติว่าฉันต้องการ: เพื่อบันทึกไฟล์ด้วย enumaration ที่เพิ่มขึ้น (file-0, file-1, file-2, ... ) สร้างโดยสิ่งเล็กน้อยสำหรับตัวอย่างนี้เช่น time > file-$x ฉันต้องทำเช่นนี้ทุกๆ 1/70 ของวินาที (เป็นตัวอย่าง) เพราะฉันต้องการแสดงเวลาของฉันด้วยเศษส่วนของวินาที ฉันจะแม่นยำและมีทุกอย่างแสดงออกด้วยสคริปต์ทุบตีได้อย่างไร เศษส่วนสามารถสร้างปริมาณที่กำหนดไม่ได้ฉันต้องแม่นยำและต้องมีทศนิยมอย่างน้อย 4-5 ตำแหน่ง
14 bash  scripting 

4
แยกหนึ่งฟิลด์จากอาร์เรย์ JSON เป็นอาร์เรย์ทุบตี
ฉันมีเอาต์พุต JSON ที่มีรายการของวัตถุที่เก็บอยู่ในตัวแปร (ฉันอาจไม่ได้ใช้ถ้อยคำที่ถูกต้อง) [ { "item1": "value1", "item2": "value2", "sub items": [ { "subitem": "subvalue" } ] }, { "item1": "value1_2", "item2": "value2_2", "sub items_2": [ { "subitem_2": "subvalue_2" } ] } ] ฉันต้องการค่าทั้งหมดสำหรับ item2 ในอาร์เรย์เพื่อให้สคริปต์ bash ทำงานบน ubuntu 14.04.1 ฉันได้พบวิธีมากมายในการรับผลลัพธ์ทั้งหมดลงในอาร์เรย์ แต่ไม่ใช่รายการที่ฉันต้องการ

2
คำสั่งของ executables เริ่มต้นด้วยการทุบตี
ถ้าฉันรันtestคำสั่งใน bash testยูทิลิตี้ในตัว (ประเมินนิพจน์แบบมีเงื่อนไข) จะเริ่มขึ้น: $ type test test is a shell builtin $ type -a test test is a shell builtin test is /usr/local/bin/test test is /usr/bin/test $ อย่างไรก็ตามดังที่เห็นในผลลัพธ์ของtype -a testข้างต้นมีอีกหนึ่งtestในไดเรกทอรี / usr / local / bin และอีกหนึ่งในไดเรกทอรี / usr / bin สั่งซื้อไฟล์เอ็กซีคิ้วท์ได้อย่างไรคือคำสั่งในตัวที่ต้องการเสมอแล้วคำสั่งที่เหลือจะขึ้นอยู่กับลำดับของไดเรกทอรีในตัวแปร $ PATH นอกจากนี้เป็นไปได้หรือไม่ที่จะเปลี่ยนลำดับของโปรแกรมเริ่มทำงานเช่นถ้าฉันพิมพ์ระบบtestจะเริ่ม / usr / …

3
Ctrl-Backspace และ Ctrl-Delete ใน bash
วางบน Debian 8.3 stty werase '^H' หรือบน Arch Linux 2/2016 stty werase '^?' ใน.bashrc(ตัวอย่าง) ทำให้Ctrl- Backspaceลบคำสุดท้ายในสถานี ก็ยังไม่ได้เป็นลักษณะการทำงานเช่นเดียวกับในโปรแกรม GUI ที่ทันสมัย (เช่น Firefox): มันลบสุดท้ายช่องว่างคำ -separated และไม่คำสุดท้ายคั่นด้วยช่องว่างหรือ. : , ; " ' & / ( )ตัวอักษรเช่น มันเป็นไปได้ที่จะทำให้Ctrl- Backspaceประพฤติตนอยู่ในขั้วคล้ายกับโปรแกรม GUI สมัยใหม่? นอกจากนี้ยังมีวิธีใดที่จะทำให้Ctrl- Deleteลบคำก่อนเคอร์เซอร์ทันทีหรือไม่

4
เพิ่มไฟล์ซ้ำในไดเรกทอรีย่อยทั้งหมด
ฉันจะเพิ่ม (หรือแตะ) ไฟล์ซ้ำ ๆ ลงในไดเรกทอรีปัจจุบันรวมถึงไดเรกทอรีย่อยทั้งหมดได้อย่างไร ตัวอย่างเช่น ฉันต้องการเปิดไดเรกทอรีต้นไม้นี้: . ├── 1 │ ├── A │ └── B ├── 2 │ └── A └── 3 ├── A └── B └── I 9 directories, 0 files เข้าไป . ├── 1 │ ├── A │ │ └── file │ ├── B │ │ └── …

3
ส่งออกโดยตรงไปยังท่อและ stdout
ฉันสงสัยว่ามีวิธีที่จะส่งออกท่อของคำสั่งและตรงไปยัง stdout ตัวอย่างเช่นfortuneพิมพ์คุกกี้โชคลาภและคัดลอกไปยังคลิปบอร์ด: $ fortune | tee >(?stdout?) | pbcopy "...Unix, MS-DOS, and Windows NT (also known as the Good, the Bad, and the Ugly)." (By Matt Welsh)
14 bash  pipe  stdout  tee 

5
เปลี่ยนชื่อไฟล์โดยการเพิ่มตัวเลขภายในชื่อไฟล์
ฉันมีไดเรกทอรีซึ่งมีไฟล์รูปภาพที่กำหนดหมายเลขไว้ดังนี้: 01.png 02.png 03.png 03.svg 04.png 05.png 06.jpg 07.png 08.png 09.png 09.svg 10.png บางครั้งอาจมีไฟล์หลายเวอร์ชันในรูปแบบที่แตกต่างกัน (เช่น a pngและsvgเวอร์ชันของ03และ09ไฟล์ด้านบน) แต่ตัวเลขจะเรียงกันเป็นอย่างอื่น โดยทั่วไปจะมีไฟล์ดังกล่าว 40-80 ไฟล์ในแต่ละไดเรกทอรี ตัวเลขสอดคล้องกับลำดับภาพเหล่านี้ปรากฏในต้นฉบับ (เอกสาร Word แต่นั่นไม่สำคัญ) ไม่มีวิธีอื่นในการกำหนดลำดับของภาพ ถ้าฉันเพิ่มรูปภาพใหม่ลงในต้นฉบับฉันต้องวางสำเนาของรูปภาพในไดเรกทอรีนี้ด้วยหมายเลขที่ถูกต้อง ดังนั้นหากภาพใหม่เป็นภาพที่ห้าในต้นฉบับฉันจำเป็นต้องเปลี่ยนชื่อไฟล์ในไดเรกทอรีเป็นสิ่งนี้เพื่อให้มีที่ว่างสำหรับมัน: 01.png 02.png 03.png 03.svg 04.png 06.png 07.jpg 08.png 09.png 10.png 10.svg 11.png อะไรคือวิธีที่ตรงไปตรงมาที่สุดจากบรรทัดคำสั่งหรือจากสคริปต์หรือแมโครเพื่อกำหนดหมายเลขไฟล์ใหม่ทั้งหมดที่เริ่มต้นด้วยจำนวนที่แน่นอน ฉันมีการติดตั้ง Fedora Linux แบบมาตรฐานโดยใช้ bash
14 linux  bash  rename 

2
เหตุใด <หรือ> จำเป็นต้องใช้ / dev / tcp
เมื่อพยายามโทร/dev/tcp/www.google.com/80โดยพิมพ์ /dev/tcp/www.google.com/80 no such file or directoryทุบตีกล่าวว่า เมื่อดูที่รหัสของคนอื่นทางออนไลน์พวกเขาใช้ไวยากรณ์เช่น 3&lt;&gt;/dev/tcp/www.google.com/80 ฉันสังเกตเห็นว่ามันใช้งานได้ดีเช่นกัน: &lt;/dev/tcp/www.google.com/80 ทำไมสัญลักษณ์เหล่านี้จำเป็นต้องเรียกบางสิ่งในทุบตี?

4
จะเกิดอะไรขึ้นถ้าฉันเริ่มงานพื้นหลังมากเกินไป
ฉันต้องทำงานกับอุปกรณ์เครือข่าย 700 ชิ้นโดยใช้สคริปต์ที่คาดไว้ ฉันสามารถทำได้ตามลำดับ แต่จนถึงขณะนี้รันไทม์ประมาณ 24 ชั่วโมง นี่คือสาเหตุส่วนใหญ่เนื่องจากเวลาที่ใช้ในการสร้างการเชื่อมต่อและความล่าช้าในผลลัพธ์จากอุปกรณ์เหล่านี้ (เก่า) ฉันสามารถสร้างการเชื่อมต่อที่สองและให้พวกเขาทำงานแบบขนานได้ดี แต่ฉันจะผลักมันไปได้ไกลแค่ไหน? ฉันไม่คิดว่าฉันสามารถทำทั้งหมด 700 ครั้งได้แน่นอนมีข้อ จำกัด บางอย่าง ของการเชื่อมต่อ telnet VM ของฉันสามารถจัดการได้ ถ้าฉันพยายามเริ่ม 700 ของพวกเขาในการวนรอบบางอย่างเช่นนี้: for node in `ls ~/sagLogs/`; do foo &amp; done กับ CPU 12 CPUs x Intel (R) Xeon (R) CPU E5649 @ 2.53GHz หน่วยความจำ 47.94 GB คำถามของฉันคือ: อินสแตนซ์ทั้งหมด …

1
ไฟล์ปฏิบัติการที่ชื่อ 'ทดสอบ' อยู่ใน $ PATH แต่จะไม่ทำงาน
ฉันมีไฟล์ใน $ HOME / bin (ก่อนที่คุณจะถามใช่มันอยู่ในเส้นทางของฉัน) เรียกว่าtestฉันยืนยันว่าสามารถดำเนินการได้ดีเมื่อฉันรันด้วยพา ธ เต็มไปยังไฟล์ อย่างไรก็ตามฉันได้รับปัญหาแปลก ๆ จริง ๆ เมื่อฉันไม่เรียกใช้วิธีนี้ เมื่อฉันเพิ่งรันtestในเทอร์มินัลมันไม่ทำอะไรเลยและส่งคืนทันที ฉันรู้ว่านี่ไม่ใช่ปัญหาในการค้นหาไฟล์ด้วยเหตุผลหลายประการ: ไม่มีข้อความแสดงข้อผิดพลาด โดยปกติหากไม่พบไฟล์หรือไม่สามารถดำเนินการข้อความจะถูกพิมพ์ออกมาโดยบอกว่า การรันwhich testยังคงส่งคืนพา ธ ไฟล์ที่ถูกต้อง น่าจะเป็นที่แปลกประหลาดของทั้งหมด - straceสคริปต์ที่ทำงานได้ดีเมื่อวิ่งผ่าน ฉันพยายามใช้straceเพื่อดูว่าฉันสามารถทราบได้ว่าเกิดอะไรขึ้น แต่เมื่อฉันใช้งานด้วยstraceมันทำงานได้อย่างที่คาดไว้กับปัญหา 0 ข้อ

2
โครงสร้างข้อมูลของ $ @ ในเชลล์คืออะไร?
เรามักจะใช้$@เพื่อเป็นตัวแทนของการโต้แย้งทั้งหมดยกเว้น $ 0 อย่างไรก็ตามฉันไม่รู้ว่าโครงสร้างข้อมูล$@คืออะไร ทำไมมันมีพฤติกรรมแตกต่างกัน$*เมื่อรวมอยู่ในเครื่องหมายคำพูดคู่ใครสามารถให้คำอธิบายระดับล่ามให้ฉันได้หรือไม่ มันสามารถวนซ้ำในห่วงดังนั้นดูเหมือนว่าจะเป็นอาร์เรย์ อย่างไรก็ตามมันยังสามารถสะท้อนได้อย่างง่ายดายecho $@ถ้าเป็นอาร์เรย์จะมีเพียงองค์ประกอบแรกเท่านั้นที่แสดง เนื่องจากข้อ จำกัด ของเชลล์ฉันไม่สามารถเขียนโค้ดการทดสอบเพิ่มเติมเพื่อดำเนินการได้ ความแตกต่างระหว่างโพสต์นี้ : โพสต์นี้แสดงให้เห็นว่า$@พฤติกรรมแตกต่างจาก$*อย่างไร $@แต่ฉันสงสัยเกี่ยวกับชนิดข้อมูลของ เชลล์ในฐานะภาษาตีความเช่น Python ควรแสดงข้อมูลตามชุดของประเภทพื้นฐาน หรือกล่าวอีกนัยหนึ่งฉันต้องการทราบว่า $ @ เก็บไว้ในหน่วยความจำคอมพิวเตอร์อย่างไร มันเป็นสตริงสตริงหลายบรรทัดหรืออาร์เรย์หรือไม่? หากเป็นชนิดข้อมูลที่ไม่ซ้ำใครเป็นไปได้ไหมที่จะกำหนดตัวแปรที่กำหนดเองเป็นตัวอย่างของประเภทนี้
13 bash  shell 

3
การขยายตัวแปรอัตโนมัติภายในคำสั่ง bash [[]]
เมื่อพิจารณาตัวแปรในbashคุณต้องใช้$เครื่องหมาย อย่างไรก็ตามดูเหมือนว่าสิ่งต่อไปนี้ใช้ได้ดี: x=5 [[ x -gt 2 ]] ใครสามารถอธิบายสิ่งนี้ได้บ้าง แก้ไข: (ข้อมูลเพิ่มเติม) สิ่งที่ฉันหมายถึงคืออะไรและทำไมคำสั่ง [[]] ถึงการยกเลิกตัวแปร x ของฉันโดยไม่มีเครื่องหมาย $ และใช่ถ้า x = 1 คำสั่งจะถูกประเมินเป็นเท็จ (สถานะส่งคืน 1)


4
เป็นไปได้ไหมที่จะพิมพ์เนื้อหาของเนื้อหาของตัวแปรด้วย shell script? (การอ้างอิงทางอ้อม)
สมมุติว่าฉันประกาศตัวแปรต่อไปนี้แล้ว: $ var='$test' $ test="my string" หากฉันพิมพ์เนื้อหาของพวกเขาฉันเห็นดังต่อไปนี้: $ echo $var $test $ echo $test my string ฉันต้องการหาวิธีพิมพ์เนื้อหาของเนื้อหาของ$var(ซึ่งเป็นเนื้อหาของ$test) ดังนั้นฉันจึงพยายามทำสิ่งต่อไปนี้: $ echo $(echo $var) $test แต่นี่คือผลลัพธ์$testและไม่ใช่"my string"... เป็นไปได้หรือไม่ที่จะพิมพ์เนื้อหาของตัวแปรโดยใช้ bash?

1
ฉันจะหยุด Bash ไม่ให้ตีความรหัสฐานแปดแทนจำนวนเต็มได้อย่างไร
ฉันกำลังเขียนสคริปต์ Horoscope RSS เป็นบทนำสู่โปรเจ็กต์ Unix / Linux และพบปัญหาศาสตราจารย์ของฉันไม่สามารถแก้ไขได้ในเวลาที่ฉันสามารถอยู่หลังเลิกเรียนได้ เนื่องจากฉันไม่สามารถหาวิธีใช้วันที่ที่แท้จริงเป็นสิ่งที่ต้องตรวจสอบฉันคิดว่าฉันลองเลขคณิตพื้นฐานโดยให้ผู้ใช้ป้อนเป็นหมายเลขมาตรฐานในรูปแบบ MMDD ตามที่เขาพูดสคริปต์ดูเหมือนว่าจะอ่านอินพุตเป็นรหัสฐานแปดแทนจำนวนเต็ม นี่คือตัวอย่างของสคริปต์: elif [ "$olddate" -gt 1121 ] &amp;&amp; [ "$olddate" -lt 1131 ] || [ "$olddate" -gt 1200 ] &amp;&amp; [ "$olddate" -lt 1222 ] then echo "You are Sagittarius" exit elif [ "$olddate" -gt 1221 ] &amp;&amp; [ …

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