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

สำหรับคำถามเกี่ยวกับสคริปต์ที่เขียนขึ้นสำหรับเชลล์คำสั่ง Bash สำหรับเชลล์สคริปต์ที่มีข้อผิดพลาด / ข้อผิดพลาดทางไวยากรณ์โปรดตรวจสอบด้วยโปรแกรม shellcheck (หรือในเซิร์ฟเวอร์ shellcheck เว็บที่ https://shellcheck.net) ก่อนโพสต์ที่นี่ คำถามเกี่ยวกับการใช้งานอินเทอร์แอคทีฟของ Bash นั้นมีแนวโน้มที่จะอยู่ในหัวข้อของผู้ใช้ขั้นสูงมากกว่าในสแต็คโอเวอร์โฟลว์

7
การรันสคริปต์ภายในคอนเทนเนอร์นักเทียบท่าโดยใช้เชลล์สคริปต์
ฉันกำลังพยายามสร้างเชลล์สคริปต์สำหรับการตั้งค่าคอนเทนเนอร์นักเทียบท่า ไฟล์สคริปต์ของฉันดูเหมือนว่า: #!bin/bash docker run -t -i -p 5902:5902 --name "mycontainer" --privileged myImage:new /bin/bash การเรียกใช้ไฟล์สคริปต์นี้จะเรียกใช้คอนเทนเนอร์ใน bash ที่เรียกใหม่ ตอนนี้ฉันต้องเรียกใช้ไฟล์สคริปต์ (test.sh) ซึ่งอยู่ในคอนเทนเนอร์แล้วจากเชลล์สคริปต์ที่กำหนดด้านบน (เช่น cd /path/to/test.sh && ./test.sh) จะทำอย่างไร?
89 bash  shell  docker 

5
ใช้นิพจน์ทั่วไปใน if-condition ใน bash
ฉันสงสัยว่ากฎทั่วไปที่จะใช้นิพจน์ทั่วไปใน if clause in bash? นี่คือตัวอย่าง $ gg=svm-grid-ch $ if [[ $gg == *grid* ]] ; then echo $gg; fi svm-grid-ch $ if [[ $gg == ^....grid* ]] ; then echo $gg; fi $ if [[ $gg == ....grid* ]] ; then echo $gg; fi $ if [[ $gg == …
88 regex  bash 

9
ฉันจะเปิดหน้าต่าง Git Bash ด้วยไดเร็กทอรีการทำงานโดยใช้สคริปต์ได้อย่างไร
ฉันจะเปิดหน้าต่าง Git Bash ใหม่พร้อมกับไดเร็กทอรีการทำงานที่ระบุโดยใช้สคริปต์ (Bash หรือ Windows batch) ได้อย่างไร เป้าหมายของฉันคือการเปิดหน้าต่าง Git Bash หลายรายการจากสคริปต์เดียวโดยแต่ละรายการจะตั้งค่าเป็นไดเรกทอรีการทำงานที่แตกต่างกัน ด้วยวิธีนี้ฉันสามารถทำงานได้อย่างรวดเร็วหลังจากบูตคอมพิวเตอร์แทนที่จะต้องเปิดหน้าต่าง Git Bash และนำทางแต่ละอันไปยังไดเร็กทอรีการทำงานที่ถูกต้อง ฉันไม่ได้ถามวิธีเปลี่ยนไดเร็กทอรีการทำงานเริ่มต้นเหมือนคำถามนี้ แต่เพื่อเปิดหน้าต่างเทอร์มินัลอย่างน้อยหนึ่งหน้าต่างด้วยไดเรกทอรีการทำงานที่แตกต่างกันจากสคริปต์

10
วิธีอัปเดตไฟล์เดียวในไฟล์ zip
เป็นไปได้ไหมที่จะแทนที่ไฟล์ในไฟล์ zip โดยไม่ต้องคลายซิปลบไฟล์เก่าโดยเพิ่มไฟล์ใหม่แล้วซิปกลับ เหตุผลคือฉันมีไฟล์ zip ซึ่งใหญ่มากมี xml หนึ่งไฟล์อยู่ในไฟล์ zip ที่ฉันต้องอัปเดตบางครั้ง การคลายซิปแล้วรูดซิปใหม่ใช้เวลานาน ดังนั้นฉันต้องการเพียงแค่สามารถแทนที่หนึ่ง xml ภายใน zip ผ่านสคริปต์ ฉันได้ตรวจสอบการอัปเดตบน xml ที่ฉันมีอยู่แล้ว ดังนั้นเป็นไปได้ไหมที่จะแทนที่ xml หนึ่งตัวโดยไม่ต้องคลายซิปแล้ว ขออภัยฉันจะใช้คำสั่ง zip เพื่อทำสิ่งต่างๆเช่นนั้น แต่ปัญหาคือสคริปต์นั้นใช้สำหรับโทรศัพท์ Android และ zip ไม่ใช่คำสั่งที่ฉันสามารถใช้ได้ขออภัยที่ฉันทิ้งมันไป ฉันจะใช้ zip อย่างแน่นอนถ้าทำได้ แต่ฉันเปิดเครื่องรูดสำหรับ droid เท่านั้นจากนั้นมี tar ใน busybox แต่ tar ไม่ทำในสิ่งที่ฉันต้องการ
88 bash  shell  zip 

6
การสร้างอาร์เรย์จากไฟล์ข้อความใน Bash
สคริปต์ใช้เวลา URL ให้แยกมันสำหรับฟิลด์ที่จำเป็นและเปลี่ยนเส้นทางการส่งออกที่จะถูกบันทึกไว้ในไฟล์file.txt เอาต์พุตจะถูกบันทึกในบรรทัดใหม่ทุกครั้งที่พบฟิลด์ file.txt A Cat A Dog A Mouse etc... ฉันต้องการรับfile.txtและสร้างอาร์เรย์จากมันในสคริปต์ใหม่โดยที่ทุกบรรทัดจะเป็นตัวแปรสตริงของตัวเองในอาร์เรย์ จนถึงตอนนี้ฉันได้ลอง: #!/bin/bash filename=file.txt declare -a myArray myArray=(`cat "$filename"`) for (( i = 0 ; i < 9 ; i++)) do echo "Element [$i]: ${myArray[$i]}" done เมื่อฉันเรียกใช้สคริปต์นี้ช่องว่างจะส่งผลให้คำถูกแยกและแทนที่จะได้รับ เอาต์พุตที่ต้องการ Element [0]: A Cat Element [1]: A Dog etc... ฉันได้รับสิ่งนี้: …

9
คุณแตกต่างไดเร็กทอรีสำหรับเฉพาะไฟล์บางประเภทได้อย่างไร?
ฉันมีคำถามเกี่ยวกับคำสั่ง diff หากฉันต้องการให้ไดเร็กทอรีแบบเรียกซ้ำ diff แต่สำหรับไฟล์บางประเภทเท่านั้นจะทำอย่างไร ฉันลองใช้ตัวเลือกการยกเว้น แต่สามารถใช้ได้เพียงรูปแบบเดียวเท่านั้น: $ diff /destination/dir/1 /destination/dir/2 -r -x *.xml ที่มีคำสั่งฉันเท่านั้นที่สามารถแยกประเภทของไฟล์ XML, แม้ว่าจะมีไฟล์ในรูปแบบภาพโฟลเดอร์ ( png, gif, jpg) txt, phpฯลฯ วิธีการแตกต่างเฉพาะไฟล์บางประเภท
88 linux  bash 

7
จะรับตัวอักษรตัวแรกในตัวแปร Bash ได้อย่างไร?
ฉันมีตัวแปร Bash $wordซึ่งบางครั้งอาจเป็นคำหรือประโยคเช่น: word="tiger" หรือ: word="This is a sentence." ฉันจะสร้างตัวแปร Bash ใหม่ซึ่งเท่ากับเฉพาะอักษรตัวแรกที่พบในตัวแปรได้อย่างไร เช่นข้างต้นจะเป็น: echo $firstletter t หรือ: echo $firstletter T

3
ความหมายสำหรับสคริปต์ Bash?
มากกว่าภาษาอื่น ๆ ที่ฉันรู้จักฉัน "เรียนรู้" Bash โดย Googling ทุกครั้งที่ฉันต้องการบางสิ่งเล็กน้อย ดังนั้นฉันสามารถเย็บปะติดปะต่อกันสคริปต์เล็ก ๆ น้อย ๆ ที่ดูเหมือนจะใช้งานได้ อย่างไรก็ตามฉันไม่รู้จริงๆว่าเกิดอะไรขึ้นและฉันหวังว่าจะมีการแนะนำ Bash อย่างเป็นทางการมากขึ้นในฐานะภาษาโปรแกรม ตัวอย่าง: ลำดับการประเมินคืออะไร? กฎการกำหนดขอบเขตคืออะไร? วินัยในการพิมพ์คืออะไรเช่นทุกอย่างเป็นสตริง? สถานะของโปรแกรมคืออะไร - เป็นการกำหนดคีย์ - ค่าของสตริงให้กับชื่อตัวแปรหรือไม่ มีอะไรมากกว่านั้นเช่นสแต็ก? มีกองไหม? และอื่น ๆ ฉันคิดว่าจะศึกษาคู่มือ GNU Bash สำหรับข้อมูลเชิงลึกประเภทนี้ แต่ดูเหมือนจะไม่เป็นอย่างที่ฉันต้องการ มันเป็นรายการซักผ้าของน้ำตาลที่มีปฏิกิริยามากกว่าคำอธิบายของแบบจำลองความหมายหลัก "แบบฝึกหัดทุบตี" แบบออนไลน์นับล้านครั้งมี แต่จะแย่ลง บางทีฉันควรศึกษาก่อนshและทำความเข้าใจกับ Bash ว่าเป็นน้ำตาลที่มีปฏิกิริยาเหนือสิ่งนี้หรือไม่? ฉันไม่รู้ว่านี่เป็นโมเดลที่ถูกต้องหรือไม่ ข้อเสนอแนะใด ๆ ? แก้ไข:ฉันถูกขอให้ยกตัวอย่างสิ่งที่ฉันต้องการ ตัวอย่างที่ค่อนข้างมากของสิ่งที่ฉันจะพิจารณา "ความหมายอย่างเป็นทางการ" คือกระดาษนี้ "สาระสำคัญของ …

10
แยกผลลัพธ์ของคำสั่งตามคอลัมน์โดยใช้ Bash?
ฉันต้องการทำสิ่งนี้: เรียกใช้คำสั่ง จับเอาท์พุท เลือกบรรทัด เลือกคอลัมน์ของบรรทัดนั้น ตัวอย่างเช่นสมมติว่าฉันต้องการรับชื่อคำสั่งจาก a $PID(โปรดทราบว่านี่เป็นเพียงตัวอย่างฉันไม่ได้แนะนำว่านี่เป็นวิธีที่ง่ายที่สุดในการรับชื่อคำสั่งจากรหัสกระบวนการ - ปัญหาจริงของฉันคือ คำสั่งอื่นที่มีรูปแบบผลลัพธ์ที่ฉันไม่สามารถควบคุมได้) ถ้าฉันวิ่งpsฉันจะได้รับ: PID TTY TIME CMD 11383 pts/1 00:00:00 bash 11771 pts/1 00:00:00 ps ตอนนี้ฉันทำps | egrep 11383และได้รับ 11383 pts/1 00:00:00 bash ขั้นตอนต่อไป: ps | egrep 11383 | cut -d" " -f 4. ผลลัพธ์คือ: <absolutely nothing/> ปัญหาคือcutตัดเอาต์พุตด้วยช่องว่างเดียวและเมื่อpsเพิ่มช่องว่างระหว่างคอลัมน์ที่ 2 และ 3 …
88 linux  bash  pipe 

3
ฉันจะใช้ Bash บน Ubuntu บน Windows (WSL) สำหรับ VS Code Terminal ได้อย่างไร
ในขณะที่คำถามอื่น ๆ เกี่ยวกับวิธีใช้สิ่งต่างๆเช่น git-bash การให้ WSL ใหม่หมุนเนื่องจากเทอร์มินัลสำหรับ VS Code ไม่เหมือนกัน: ช่วยให้คุณเข้าถึง bash ที่ทำงานบนระบบย่อย Ubuntu Linux จริงแทน git- bash terminal ทำงานบนระบบย่อยของ Windows ดังนั้นเราจะทำให้มันทำงานเป็นเทอร์มินัล VS Code ได้อย่างไรและโดยเฉพาะอย่างยิ่งเราจะทำให้มันทำงานเป็นเทอร์มินัลสภาพแวดล้อม dev ที่ใช้งานได้อย่างไร ซึ่งแตกต่างจาก git-bash แต่น่าเสียดายที่ไม่ง่ายอย่างที่คิดเนื่องจากการกำหนดค่า Ubuntu Linux ใน WSL สามารถให้ gotchas บางอย่างเช่น NPM พยายาม (และล้มเหลว) เพื่อเรียกใช้จากไดเร็กทอรี Windows Program Files ของคุณเนื่องจากการโต้ตอบระหว่าง WSL และ Windows ใน เงื่อนไขของการกำหนดเส้นทางและบางแพ็กเกจเช่น …

3
วิธีไพพ์อินพุตไปยัง Bash ในขณะที่วนซ้ำและเก็บรักษาตัวแปรหลังจากลูปสิ้นสุดลง
Bash อนุญาตให้ใช้: cat <(echo "$FILECONTENT") Bash ยังอนุญาตให้ใช้: while read i; do echo $i; done </etc/passwd เพื่อรวมสองสิ่งนี้ก่อนหน้านี้สามารถใช้ได้: echo $FILECONTENT | while read i; do echo $i; done ปัญหาสุดท้ายคือมันสร้างเชลล์ย่อยและหลังจากที่ตัวแปร while ลูปสิ้นสุดลง iไม่สามารถเข้าถึงได้อีกต่อไป คำถามของฉันคือ: วิธีการบรรลุสิ่งนี้: while read i; do echo $i; done <(echo "$FILECONTENT")หรือกล่าวอีกนัยหนึ่ง: ฉันจะแน่ใจได้อย่างไรiมีชีวิตอยู่ในขณะที่วนซ้ำ? โปรดทราบว่าฉันตระหนักถึงการใส่คำสั่ง while เข้าไป{}แต่สิ่งนี้ไม่สามารถแก้ปัญหาได้ (ลองนึกภาพว่าคุณต้องการใช้ฟังก์ชัน while loop in และiตัวแปรreturn …
88 bash  while-loop  stdin  pipe 


3
ฉันจะทดสอบสตริงว่างในคำสั่งกรณี Bash ได้อย่างไร
ฉันมีสคริปต์ Bash ที่ดำเนินการตามค่าของตัวแปร ไวยากรณ์ทั่วไปของคำสั่ง case คือ: case ${command} in start) do_start ;; stop) do_stop ;; config) do_config ;; *) do_help ;; esac ฉันต้องการดำเนินการรูทีนดีฟอลต์หากไม่มีการระบุคำสั่งและdo_helpหากไม่รู้จักคำสั่ง ฉันพยายามละเว้นค่าเคสดังนี้: case ${command} in ) do_default ;; ... *) do_help ;; esac ผลลัพธ์สามารถคาดเดาได้ฉันคิดว่า: syntax error near unexpected token `)' จากนั้นฉันลองใช้ regex: case ${command} in ^$) do_default ;; …
87 string  bash  null  case 

7
bash - วิธีไพพ์ผลลัพธ์จากคำสั่งใดไปยัง cd
ฉันจะไพพ์ผลลัพธ์จากwhichคำสั่งไปที่cd? นี่คือสิ่งที่ฉันพยายามทำ: which oracle | cd cd < which oracle แต่ไม่ได้ผล มีวิธีในการบรรลุเป้าหมายนี้หรือไม่ (แทนที่จะคัดลอก / วางแน่นอน) แก้ไข: ในความคิดที่สองคำสั่งนี้จะล้มเหลวเพราะแฟ้มปลายทางไม่ได้เป็นโฟลเดอร์ ดังนั้นฉันจึงคิดและหาวิธีที่ดีกว่าในการกำจัดส่วนท้าย "/ oracle" ตอนนี้ (sed หรือ awk หรือแม้แต่ Perl) :) แก้ไข: โอเคนั่นคือสิ่งที่ฉันมีในตอนท้าย: cd `which oracle | sed 's/\/oracle//g'`
87 linux  bash  shell  cd 

16
ขนานสคริปต์ Bash ด้วยจำนวนกระบวนการสูงสุด
ให้บอกว่าฉันมีวงใน Bash: for foo in `some-command` do do-something $foo done do-somethingซีพียูถูกผูกไว้และฉันมีโปรเซสเซอร์ 4 คอร์ที่ดี ฉันต้องการที่จะสามารถวิ่งได้ถึง 4 do-somethingครั้งในครั้งเดียว แนวทางที่ไร้เดียงสาดูเหมือนจะ: for foo in `some-command` do do-something $foo & done สิ่งนี้จะทำงานทั้งหมด do-somethingพร้อมกัน แต่มีข้อเสียอยู่สองสามประการโดยส่วนใหญ่การทำบางอย่างอาจมี I / O ที่สำคัญบางอย่างซึ่งการทำงานทั้งหมดในครั้งเดียวอาจช้าลงเล็กน้อย ปัญหาอื่น ๆ คือบล็อกโค้ดนี้จะส่งคืนทันทีดังนั้นจึงไม่มีวิธีทำงานอื่น ๆ เมื่อdo-somethingเสร็จสิ้นทั้งหมด คุณจะเขียนลูปนี้อย่างไรเพื่อให้ X do-somethings ทำงานพร้อมกันเสมอ?
87 bash 

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