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

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

6
ความแตกต่างระหว่าง PS1 และ PROMPT_COMMAND คืออะไร
ในขณะที่ดูหัวข้อที่ยอดเยี่ยมนี้ฉันสังเกตเห็นว่าบางตัวอย่างใช้ PS1="Blah Blah Blah" และการใช้งานบางอย่าง PROMPT_COMMAND="Blah Blah Blah" (และบางคนใช้ทั้งสองอย่าง) เมื่อตั้งค่าพรอมต์ใน bash shell อะไรคือความแตกต่างระหว่างทั้งสอง? การค้นหา SO และการค้นหาด้วย Google ที่กว้างขึ้นเล็กน้อยก็ไม่ได้รับผลลัพธ์ดังนั้นแม้แต่ลิงก์ไปยังตำแหน่งที่ถูกต้องเพื่อค้นหาคำตอบก็จะได้รับการชื่นชม
108 bash  prompt 

4
ใช้ unset เทียบกับการตั้งค่าตัวแปรให้ว่างเปล่า
ฉันกำลังเขียนกรอบการทดสอบทุบตีซึ่งในฟังก์ชันการทดสอบสามารถใช้ทั้งการทดสอบทุบตีมาตรฐาน ( [[) และตัวจับคู่ที่กำหนดไว้ล่วงหน้าได้ Matchers เป็นตัวห่อเป็น "[[" และนอกเหนือจากการส่งคืนรหัสส่งคืนแล้วให้ตั้งค่าข้อความที่มีความหมายเพื่อบอกสิ่งที่คาด ตัวอย่าง: string_equals() { if [[ ! $1 = $2 ]]; then error_message="Expected '$1' to be '$2'." return 1 fi } ดังนั้นเมื่อใช้ตัวจับคู่และล้มเหลวระบบจะตั้งค่า error_message เท่านั้น ในเวลาต่อมาฉันทดสอบว่าการทดสอบสำเร็จหรือไม่ หากสำเร็จฉันจะพิมพ์ความคาดหวังเป็นสีเขียวหากล้มเหลวเป็นสีแดง นอกจากนี้อาจมีชุด error_message ดังนั้นฉันจึงทดสอบว่ามีข้อความอยู่หรือไม่พิมพ์แล้วจึงยกเลิกการตั้งค่า (เนื่องจากการทดสอบต่อไปนี้อาจไม่ได้ตั้งค่า a error_message): if [[ $error_message ]]; then printf '%s\n' "$error_message" unset -v error_message …
108 bash  variables  syntax 

7
ระบุผู้ใช้ในสคริปต์ Bash ที่เรียกโดย sudo
หากฉันสร้างสคริปต์/root/bin/whoami.shที่มี: #!/bin/bash whoami และสคริปต์นี้ถูกเรียกโดยผู้ใช้ที่มีการกำหนดค่า sudo อย่างเหมาะสมมันจะระบุ root มีวิธีที่รวดเร็วในการรับผู้ใช้จริงในสคริปต์หรือไม่หรือฉันจะต้องใช้พารามิเตอร์ที่ส่งผ่านชื่อผู้ใช้นี้
108 linux  bash  sudo 


13
การเว้นอักขระในพิมพ์ f
ฉันกำลังเขียนสคริปต์ bash เชลล์เพื่อแสดงว่ากระบวนการกำลังทำงานอยู่หรือไม่ จนถึงตอนนี้ฉันได้รับสิ่งนี้: printf "%-50s %s\n" $PROC_NAME [UP] รหัสให้ผลลัพธ์นี้แก่ฉัน: JBoss [DOWN] GlassFish [UP] verylongprocessname [UP] ฉันต้องการเว้นช่องว่างระหว่างสองฟิลด์ด้วย '-' หรือ '*' เพื่อให้อ่านง่ายขึ้น ฉันจะทำได้อย่างไรโดยไม่รบกวนการจัดตำแหน่งของฟิลด์ ผลลัพธ์ที่ฉันต้องการคือ: JBoss ------------------------------------------- [DOWN] GlassFish --------------------------------------- [UP] verylongprocessname ----------------------------- [UP]
108 bash  shell  printf 

11
ทุบตีการขยายอาร์เรย์ว่างด้วย "set -u"
ฉันกำลังเขียนสคริปต์ bash ซึ่งมีset -uและฉันมีปัญหากับการขยายอาร์เรย์ที่ว่างเปล่า: bash ดูเหมือนจะถือว่าอาร์เรย์ว่างเป็นตัวแปรที่ไม่ได้ตั้งค่าระหว่างการขยาย: $ set -u $ arr=() $ echo "foo: '${arr[@]}'" bash: arr[@]: unbound variable ( declare -a arrไม่ช่วยเช่นกัน) วิธีแก้ปัญหาทั่วไปสำหรับสิ่งนี้คือการใช้${arr[@]-}แทนดังนั้นการแทนที่สตริงว่างแทนที่จะเป็นอาร์เรย์ว่าง ("ไม่ได้กำหนด") อย่างไรก็ตามนี่ไม่ใช่วิธีแก้ปัญหาที่ดีเนื่องจากตอนนี้คุณไม่สามารถแยกแยะระหว่างอาร์เรย์ที่มีสตริงว่างเดียวกับอาร์เรย์ว่างได้ (@ - การขยายเป็นพิเศษในการทุบตีมันขยายออก"${arr[@]}"ไป"${arr[0]}" "${arr[1]}" …ซึ่งทำให้เป็นเครื่องมือที่สมบูรณ์แบบสำหรับการสร้างบรรทัดคำสั่ง) $ countArgs() { echo $#; } $ countArgs a b c 3 $ countArgs 0 $ countArgs "" 1 …
108 bash 

10
ฉันจะวางรหัสทุบตีแบบหลายบรรทัดลงในเทอร์มินัลและเรียกใช้ทั้งหมดพร้อมกันได้อย่างไร
ฉันต้องการวางรหัสทุบตีแบบหลายบรรทัดลงในเทอร์มินัล แต่เมื่อใดก็ตามที่ฉันทำแต่ละบรรทัดจะทำงานเป็นคำสั่งแยกกันทันทีที่วาง
108 linux  bash  shell  terminal  paste 

2
เหตุใดจึงควรหลีกเลี่ยงการประเมินใน Bash และฉันควรใช้อะไรแทน
ครั้งแล้วครั้งเล่าที่ฉันเห็นคำตอบของ Bash ใน Stack Overflow โดยใช้evalและคำตอบได้รับการเจาะรูโดยตั้งใจสำหรับการใช้โครงสร้าง "ชั่วร้าย" ดังกล่าว ทำไมevalชั่วจัง ถ้าevalใช้ไม่ได้อย่างปลอดภัยควรใช้อะไรแทน?
107 linux  bash  unix  eval 

4
เชลล์สคริปต์ในขณะที่อ่านลูปบรรทัดหยุดหลังจากบรรทัดแรก
ฉันมีเชลล์สคริปต์ต่อไปนี้ จุดประสงค์คือเพื่อวนผ่านแต่ละบรรทัดของไฟล์เป้าหมาย (ซึ่งพา ธ เป็นพารามิเตอร์อินพุตไปยังสคริปต์) และทำงานกับแต่ละบรรทัด ตอนนี้ดูเหมือนว่าจะใช้ได้เฉพาะกับบรรทัดแรกในไฟล์เป้าหมายและหยุดหลังจากที่บรรทัดนั้นได้รับการประมวลผล มีอะไรผิดปกติกับสคริปต์ของฉันหรือไม่? #!/bin/bash # SCRIPT: do.sh # PURPOSE: loop thru the targets FILENAME=$1 count=0 echo "proceed with $FILENAME" while read LINE; do let count++ echo "$count $LINE" sh ./do_work.sh $LINE done < $FILENAME echo "\ntotal $count targets" ในdo_work.shฉันเรียกใช้sshคำสั่งสองสามคำสั่ง
107 bash  shell  ssh  while-loop 

2
วิธีรักษาตัวแบ่งบรรทัดเมื่อจัดเก็บเอาต์พุตคำสั่งไปยังตัวแปร
ฉันใช้ bash shell บน Linux ฉันมีสคริปต์ง่ายๆนี้ ... #!/bin/bash TEMP=`sed -n '/'"Starting deployment of"'/,/'"Failed to start context"'/p' "/usr/java/jboss/standalone/log/server.log" | tac | awk '/'"Starting deployment of"'/ {print;exit} 1' | tac` echo $TEMP อย่างไรก็ตามเมื่อฉันเรียกใช้สคริปต์นี้ ./temp.sh ผลลัพธ์ทั้งหมดจะถูกพิมพ์โดยไม่มีการคืนแคร่ / ขึ้นบรรทัดใหม่ ไม่แน่ใจว่าเป็นวิธีที่ฉันจัดเก็บผลลัพธ์ไว้ที่ $ TEMP หรือคำสั่ง echo เอง ฉันจะจัดเก็บเอาต์พุตของคำสั่งไปยังตัวแปรและรักษาการแบ่งบรรทัด / การส่งคืนค่าขนส่งได้อย่างไร
107 linux  bash  shell  line-breaks 

8
ความหมายของ tilde ใน Linux bash (ไม่ใช่โฮมไดเร็กทอรี)
ก่อนอื่นฉันรู้ว่านั่น~/คือโฮมไดเร็กทอรี กำลังซีดี~หรือ~/พาฉันไปที่โฮมไดเร็กทอรี อย่างไรก็ตามcd ~Xพาฉันไปที่พิเศษซึ่งXดูเหมือนจะเป็นอะไรก็ได้ ในทุบตีถ้าผมตี " cd ~" และแท็บตีก็แสดงให้เห็นพวงของการที่เป็นไปได้~Xตัวเลือกเช่น~mailและและ~postgres ~sshไปที่โฟลเดอร์เหล่านั้นและpwdแสดงให้ฉันเห็นว่าโฟลเดอร์เหล่านี้ไม่ได้อยู่ในโฮมไดเร็กทอรี พวกเขาอยู่ทั่วทุกแห่ง พวกเขาไม่ใช่นามแฝง ฉันตรวจสอบแล้ว พวกเขาไม่ใช่env.ตัวแปรหรืออื่น ๆ ที่พวกเขาต้องการ$. การตั้งค่าลิงก์เหล่านี้คืออะไรและฉันจะหาได้จากที่ใด

10
ทำไม sed ถึงไม่รู้จัก \ t เป็นแท็บ
sed "s/\(.*\)/\t\1/" $filename > $sedTmpFile && mv $sedTmpFile $filename ฉันคาดหวังว่าsedสคริปต์นี้จะแทรกtabด้านหน้าของทุกบรรทัด$filenameแต่มันไม่ใช่ ด้วยเหตุผลบางประการจึงเป็นการแทรกtแทน
106 regex  bash  sed 

11
Unix ผลต่างจากด้านหนึ่งไปอีกด้านหนึ่ง?
ฉันจะพล็อตผลลัพธ์ของคำสั่ง unix diff แบบเคียงข้างกันแทนที่จะเป็นความแตกต่างหนึ่งหลังจากที่อื่นได้อย่างไร ดูตัวอย่างด้านล่าง: diff /tmp/test1 /tmp/test2 1,4c1,2 < asfdsadf < asdfsad < fsaf < fdsadf --- > asdfsafdsf > saf 6,8d3 < sadf < asdf < sadf 10d4 < fasd 12,13c6,14 < sadfa < fd --- > sadf > sadf > sadf > sadf > sadf > sadf …
106 bash  unix  diff 

6
เพิ่มนามสกุลไฟล์ซ้ำ ๆ ในไฟล์ทั้งหมด
ฉันมีไดเร็กทอรีและไดเร็กทอรีย่อยสองสามรายการที่มีไฟล์ที่ไม่มีนามสกุลไฟล์ ฉันต้องการเพิ่มลง.jpgในไฟล์ทั้งหมดที่อยู่ในไดเร็กทอรีเหล่านี้ ฉันเคยเห็นสคริปต์ทุบตีสำหรับการเปลี่ยนนามสกุลไฟล์ แต่ไม่ใช่แค่การเพิ่ม ยังต้องเรียกซ้ำใครช่วยได้ไหม

13
วิธีการวนซ้ำผ่านสาขา git ทั้งหมดโดยใช้ bash script
ฉันจะวนซ้ำผ่านสาขาท้องถิ่นทั้งหมดในที่เก็บของฉันโดยใช้สคริปต์ทุบตีได้อย่างไร ฉันต้องทำซ้ำและตรวจสอบว่ามีความแตกต่างระหว่างสาขาและสาขาที่อยู่ห่างไกลหรือไม่ เช่น for branch in $(git branch); do git log --oneline $branch ^remotes/origin/master; done ฉันต้องทำบางอย่างตามที่ระบุไว้ข้างต้น แต่ปัญหาที่ฉันเผชิญคือ $ (git branch) ทำให้ฉันมีโฟลเดอร์ภายในโฟลเดอร์ที่เก็บพร้อมกับสาขาที่มีอยู่ในที่เก็บ นี่เป็นวิธีที่ถูกต้องในการแก้ปัญหานี้หรือไม่ หรือมีวิธีอื่นทำได้หรือไม่ ขอบคุณ
106 git  bash  git-bash 

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