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

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

4
ฉันจะรู้ได้อย่างไรว่าสคริปต์ bash ที่กำลังเรียกใช้อยู่ในปัจจุบันได้รับการเรียกใช้ด้วย -x เพื่อการดีบั๊กหรือไม่
ฉันมีสคริปต์launch.shที่รันตัวเองเป็นผู้ใช้อื่นเพื่อสร้างไฟล์กับเจ้าของที่ถูกต้อง ฉันต้องการส่ง -x ไปยังการเรียกใช้นี้หากผ่านมาถึงสคริปต์แล้ว if [ `whoami` == "deployuser" ]; then ... bunch of commands that need files to be created as deployuser else echo "Respawning myself as the deployment user... #Inception" echo "Called with: <$BASH_ARGV>, <$BASH_EXECUTION_STRING>, <$->" sudo -u deployuser -H bash $0 "$@" # How to pass -x …
11 bash  debugging 

3
แทนที่สตริงจำนวนมากในการส่งผ่านครั้งเดียว
ฉันกำลังมองหาวิธีที่จะแทนที่สตริงตัวยึดตำแหน่งในไฟล์แม่แบบด้วยค่าที่เป็นรูปธรรมด้วยเครื่องมือ Unix ทั่วไป (ทุบตี, sed, awk, อาจ perl) เป็นสิ่งสำคัญที่การเปลี่ยนจะดำเนินการในรอบเดียวนั่นคือสิ่งที่สแกน / เปลี่ยนแล้วจะต้องไม่ถูกนำมาพิจารณาสำหรับการเปลี่ยนใหม่ ตัวอย่างเช่นความพยายามสองครั้งนี้ล้มเหลว: echo "AB" | awk '{gsub("A","B");gsub("B","A");print}' >> AA echo "AB" | sed 's/A/B/g;s/B/A/g' >> AA ผลลัพธ์ที่ถูกต้องในกรณีนี้คือหลักสูตร BA โดยทั่วไปการแก้ปัญหาควรเทียบเท่ากับการสแกนอินพุตจากซ้ายไปขวาสำหรับการจับคู่ที่ยาวที่สุดไปยังสตริงการแทนที่ที่กำหนดอย่างใดอย่างหนึ่งและสำหรับการแข่งขันแต่ละครั้งทำการแทนที่และดำเนินการต่อจากจุดนั้นบนอินพุต (ไม่มี อ่านอินพุตแล้วหรือการแทนที่ที่ดำเนินการควรพิจารณาให้ตรงกัน) ที่จริงแล้วรายละเอียดไม่สำคัญเพียงแค่ว่าผลของการเปลี่ยนจะไม่ถูกนำมาพิจารณาสำหรับการทดแทนอื่นทั้งหมดหรือบางส่วน หมายเหตุฉันกำลังมองหาโซลูชันทั่วไปที่ถูกต้องเท่านั้น โปรดอย่าเสนอวิธีแก้ปัญหาที่ล้มเหลวสำหรับอินพุตบางอย่าง (ไฟล์อินพุต, ค้นหาและแทนที่คู่) แต่ไม่น่าจะเป็นไปได้
11 bash  sed  awk  string  replace 

2
จะปลอดภัยหรือไม่ที่จะประเมิน $ BASH_COMMAND
ฉันทำงานกับเชลล์สคริปต์ที่สร้างคำสั่งที่ซับซ้อนจากตัวแปรเช่นนี้ (ด้วยเทคนิคที่ฉันได้เรียนรู้จาก Bash FAQ ): #!/bin/bash SOME_ARG="abc" ANOTHER_ARG="def" some_complex_command \ ${SOME_ARG:+--do-something "$SOME_ARG"} \ ${ANOTHER_ARG:+--with "$ANOTHER_ARG"} สคริปต์แบบนี้เพิ่มพารามิเตอร์--do-something "$SOME_ARG"และ--with "$ANOTHER_ARG"การsome_complex_commandหากตัวแปรเหล่านี้ถูกกำหนด จนถึงตอนนี้ก็ใช้งานได้ดี แต่ตอนนี้ฉันต้องการพิมพ์หรือบันทึกคำสั่งเมื่อฉันใช้งานเช่นเมื่อสคริปต์ของฉันทำงานในโหมดดีบัก ดังนั้นเมื่อสคริปต์ของฉันทำงานsome_complex_command --do-something abc --with defฉันยังต้องการให้คำสั่งนี้อยู่ในตัวแปรเพื่อให้ฉันสามารถบันทึกลงใน syslog Bash คำถามที่พบบ่อยแสดงให้เห็นถึงเทคนิคในการใช้DEBUGกับดักและ$BASH_COMMANDตัวแปร (ตัวอย่างเช่นสำหรับวัตถุประสงค์ในการแก้จุดบกพร่อง) สำหรับวัตถุประสงค์นี้ ฉันลองด้วยรหัสต่อไปนี้: #!/bin/bash ARG="test string" trap 'COMMAND="$BASH_COMMAND"; trap - DEBUG' DEBUG echo "$ARG" echo "Command was: ${COMMAND}" ใช้งานได้ แต่ไม่ขยายตัวแปรในคำสั่ง: host ~ …
11 bash 


2
วิธีจัดทำฟังก์ชั่นทุบตีและนามแฝงที่กำหนดเองของฉัน
ปัญหา: ฉันมีฟังก์ชั่นทุบตีและชื่อแทนหลายรายการ ฉันจำไม่ได้ว่าพวกเขาทั้งหมดอยู่ด้านบนของหัวของฉันดังนั้นฉันมักจะเปิดท้ายของฉัน.bash_functionsและ.bash_aliasesไฟล์เพื่อค้นหาสิ่งที่ฉันต้องการ คำถาม (s): ฉันจะแสดงรายการฟังก์ชั่น / นามแฝงที่มีอยู่จาก bash prompt ได้อย่างไร? เป็นไปได้ไหมที่ฉันจะทำเอกสารฟังก์ชั่นทุบตี / นามแฝงของฉันโดยใช้ความคิดเห็น (kinda เช่น PHPDoc)? ฉันแค่ต้องการวิธีที่ง่าย / ดีในการแสดงผลสิ่งที่มีอยู่โดยไม่ต้องเปิดไฟล์ มันจะเจ๋งมากในการรันคำสั่งและปล่อยให้มันมีรายการแบบไดนามิกของฟังก์ชั่น / ชื่อแทนของฉัน (ตัวอย่างการใช้งานจะเป็นบวก) :)

2
วิธีกำหนดลิงก์สัญลักษณ์ที่ฉันสามารถใช้ได้ในทุกไดเร็กทอรี
เป็นไปได้หรือไม่ที่จะตั้งลิงก์สัญลักษณ์เพื่อให้ฉันสามารถใช้projectชี้ไดเรกทอรีhome/me/projectได้เช่น? สิ่งนี้ควรเป็นอิสระจากตำแหน่งในระบบไฟล์ ฉันต้องการใช้คำสั่งเช่นcd projectนี้nano project/file1.texเป็นต้น ฉันต้องเขียนลิงค์สัญลักษณ์ไปยังไดเรกทอรีทั้งหมดของฉันหรือไม่?
11 bash  symlink 

3
กำลังประมวลผลการตอบรับใช่ / ไม่จากผู้ใช้ Bash
สิ่งนี้เป็นอย่างดีอาจจะโง่ในส่วนของฉัน ฉันต้องการยอมรับว่าใช่ / ไม่ใช่คำตอบจริง / เท็จภายในสคริปต์ Bash ของฉัน: test.sh #!/bin/bash ARGUMENT=$1 echo User passed in $ARGUMENT OPTARG=${ARGUMENT:0:1} if [[ "$OPTARG" -eq 0 ]] || [[ "${OPTARG^^}" == "N" ]]; then echo Decline elif [[ "$OPTARG" -eq 1 ]] || [[ "${OPTARG^^}" == "Y" ]]; then echo Accept else echo Invalid …
11 bash 

6
ท่อกึ่งอะซิงโครนัส
สมมติว่าฉันมีท่อต่อไปนี้: a | b | c | d ฉันจะรอให้เสร็จสิ้นการc(หรือb) ในshหรือbash? ซึ่งหมายความว่าสคริปต์dสามารถเริ่มต้นได้ตลอดเวลา (และไม่จำเป็นต้องรอ) แต่ต้องการเอาต์พุตที่สมบูรณ์จากcการทำงานอย่างถูกต้อง กรณีการใช้งานมีdifftoolไว้สำหรับgitเปรียบเทียบรูปภาพ มันถูกเรียกใช้โดยgitและต้องการประมวลผลอินพุต ( a | b | cส่วน) และแสดงผลลัพธ์ของการเปรียบเทียบ ( dส่วน) โทรจะลบการป้อนข้อมูลที่จำเป็นสำหรับการและa bซึ่งหมายความว่าก่อนที่จะส่งคืนจากสคริปต์กระบวนการc(หรือb) จะต้องยุติ ในทางกลับกันฉันไม่สามารถรอได้dเพราะนี่หมายความว่าฉันกำลังรอการป้อนข้อมูลจากผู้ใช้ ฉันรู้ว่าฉันสามารถเขียนผลของการcไปยังแฟ้มชั่วคราวหรืออาจจะใช้ FIFO bashใน (ไม่แน่ใจว่า FIFO จะช่วยได้หรือไม่) เป็นไปได้ไหมหากไม่มีไฟล์ชั่วคราวsh? แก้ไข อาจจะเพียงพอหากฉันสามารถหา ID กระบวนการของกระบวนการc(หรือb) ในแบบที่เชื่อถือได้ จากนั้นไพพ์ทั้งหมดสามารถเริ่มต้นแบบอะซิงโครนัสได้และฉันอาจรอรหัสกระบวนการ บางสิ่งบางอย่างตามแนวของ wait $(a | b | { c & …
11 bash  shell  pipe  fifo 

1
ล้างบรรทัดพรอมต์เก่าในทุบตีเพื่อประหยัดพื้นที่เลื่อน
ชุดรูปแบบเทอร์มินัลของฉันเคยเป็นเช่นนี้ แต่ฉันคิดว่าพรอมต์เสียพื้นที่มากมาย และต่อมาฉันก็มีความคิดว่าฉันสามารถทำความสะอาดพรอมต์ทุกครั้งที่ฉันมีคำสั่ง ฉันใช้ทุบตีวิธีหนึ่งคือใช้preexec_invoke_execฟังก์ชั่น ฉันใช้คำสั่งต่อไปนี้เพื่อทำความสะอาดตัวอักษรพรอมต์ล่าสุด: echo -ne "\033[1A\033[K\033[1A\033[K\033[31;1m$ \033[0m" เพื่อให้เครื่องนั้นสะอาดมากเช่นนี้ แต่ตอนนี้ปัญหาของฉันจะมีปัญหาถ้าผมต้องการที่จะใช้คำสั่งหลายในหนึ่งบรรทัดfor i in ...กล่าวว่าเมื่อผมใช้ นี่คือเวอร์ชั่นเต็มของฟังก์ชั่นใน. bashrc ของฉัน preexec () { echo -ne "\033[1A\033[K\033[1A\033[K\033[31;1m$ \033[0m"; echo -n "$1"; echo -ne " \033[37;2m["; echo -n "$2"; echo -ne "]\033[0m\n"; } preexec_invoke_exec () { [ -n "$COMP_LINE" ] && return # do nothing …
11 bash  shell  terminal  prompt 

4
ผ่านฟังก์ชั่นไปยังผู้ใช้คนอื่นใน Bash?
มีวิธีใดบ้างที่ฉันสามารถส่งผ่าน Function จากผู้ใช้รายหนึ่งไปยังผู้ใช้รายอื่น? ตัวอย่างเช่นฉันมีสคริปต์ Bash ขนาดเล็กที่ฉันเรียกใช้เป็นรูต: #!/bin/bash user_func(){ whoami exit } su vagrant -c 'user_func' อย่างไรก็ตามฟังก์ชั่น user_func ไม่ได้ถูกกำหนดไว้สำหรับผู้ใช้ Vagrant เฉพาะสำหรับรูทและไม่สามารถดำเนินการได้ ตัวเลือกอื่นของฉันจะมีหลายบรรทัด su vagrant -c 'cmd1' su vagrant -c 'cmd2' , etc หรือดำเนินการหลายคำสั่งเช่น: su vagrant -c 'cmd1; cmd2; cmd3;'แต่ฉันไม่ต้องการมีส่วนเกินโดยเฉพาะเมื่อพยายามเรียกใช้คำสั่งมากกว่า 5 คำสั่งในฐานะผู้ใช้ Vagrant เป็นไปได้ไหมที่จะส่ง Function ให้กับผู้ใช้รายอื่นจากภายในสคริปต์เดียวกัน (เช่นไม่ได้สร้างสคริปต์บนดิสก์ในฐานะผู้ใช้รายอื่นแล้วเรียกใช้งานสคริปต์ที่สร้างขึ้น) หรือมีตัวเลือกอื่นที่ฉันสามารถมองเห็นได้?
11 bash 

2
ทำไมการทดแทนกระบวนการ <() ไม่ทำงานกับ ssh -F
ฉันมีบางเครื่องเสมือนจรจัด เพื่อเข้าสู่พวกเขาฉันออกvagrant sshคำสั่ง ฉันต้องการเข้าสู่ระบบโดยใช้sshคำสั่งปกติ vagrant ssh-configออกผลลัพธ์เป็นไฟล์ config ที่เหมาะสม $ vagrant ssh-config Host default HostName 127.0.0.1 User vagrant Port 2201 UserKnownHostsFile /dev/null StrictHostKeyChecking no PasswordAuthentication no IdentityFile /home/cbliard/.vagrant.d/insecure_private_key IdentitiesOnly yes LogLevel FATAL เมื่อส่งออกการกำหนดค่านี้ในไฟล์และใช้กับssh -Fทุกอย่างทำงานได้ดี: $ vagrant ssh-config &gt; /tmp/config $ ssh -F /tmp/config default =&gt; logged successfully เมื่อใช้ตัวดำเนินการทดแทนกระบวนการ&lt;(cmd)เพื่อป้องกันการสร้างไฟล์กำหนดค่าชั่วคราวมันจะล้มเหลว: $ ssh -F …

3
bash: ปัญหาบางอย่างเมื่อใช้การอ่าน <<<“ $ VARIABLE” บนพาร์ติชันรูทแบบอ่านอย่างเดียว การแก้ไขปัญหาใด ๆ ที่รู้จักกัน?
โดยบังเอิญฉันต้องใช้สคริปต์ ATA-ID-to-device-name (อยู่ที่นี่: /server/244944/linux-ata-errors-translating-to-a-device-name/ 426561 # 426561 ) ในพาร์ติชันแบบอ่านอย่างเดียว /ในกรณีที่คุณอยากรู้อยากเห็นมันเป็นคอนโซลการกู้คืนของ Ubuntu ซึ่งจะช่วยให้คุณเข้าถึง/พาร์ติชันของคุณแต่จะติดตั้งเป็นอ่านอย่างเดียวโดยค่าเริ่มต้น ฉันดีใจที่เป็นเช่นนั้นเพราะไม่เช่นนั้นฉันอาจไม่เคยพบว่าสคริปต์ของฉันทำงานผิดปกติในระบบ R / O เนื่องจากบรรทัดที่เฉพาะเจาะจงอันนี้: IFS=: read HostMain HostMid HostSub &lt;&lt;&lt; "$HostFull" วิธีนี้ใช้ไม่ได้หากไม่มีสิทธิ์ในการเขียน ฉันไม่คิดเลยว่ามันจะล้มเหลว แต่เห็นได้ชัดว่า&lt;&lt;&lt;ผู้ประกอบการไม่จำเป็นต้องเขียนไฟล์ชั่วคราวบางส่วนไปยังที่อื่น แต่มีวิธีใดที่จะหลีกเลี่ยงการสร้างไฟล์ชั่วคราวหรือมีวิธีใดที่จะระบุตำแหน่งของไฟล์ที่ถูกเขียนไป? ในคอนโซลการกู้คืนของอูบุนตูมี - ผิดปกติพอ --- เขียนสิทธิ์ใน/runไดเรกทอรีดังนั้นถ้าฉันสามารถ "บอก" readเพื่อเขียนไฟล์ชั่วคราวไปที่อื่นที่ไม่ใช่ปกติ

2
คุณสมบัติเชลล์ชื่ออะไร> (tee copyError.txt> & 2) `?
ฉันต้องเข้าสู่ระบบ stdout และ stderr เพื่อ logfiles แต่เพียงแสดงข้อความผิดพลาดบนหน้าจอ ฉันสามารถทำได้ด้วย: cp -rpv a/* b 1&gt; copyLog.txt 2&gt; &gt;(tee copyError.txt &gt;&amp;2) ซึ่งฉันพบที่ไหนสักแห่งในเว็บ ฉันแค่อยากรู้ว่า&gt;(tee copyError.txt &gt;&amp;2)สิ่งนี้เรียกว่าอะไร? ฉันทำไม่ได้เพราะ Google ไม่สนใจอักขระเช่นวงเล็บเหลี่ยมและวงเล็บ ..
11 bash  shell 

4
ป้องกันไม่ให้ข้อความ / หน้าจอกระพริบเมื่อทำชัดเจน
สคริปต์ของฉันทำสิ่งที่ชอบ: while :; clear do_a_lot_of_output_here sleep 1 done มันเป็นตัวเลือกใด ๆ เพื่อป้องกันหน้าจอกระพริบเมื่อฉันทำชัดเจนและส่งออก? ฉันต้องการที่จะทำมันเหมือนในwatchคำสั่ง (แต่มันเขียนไว้ในC) คำแนะนำใด ๆ clear | hexdump -C 00000000 1b 5b 48 1b 5b 32 4a |.[H.[2J| 00000007 PS ฉันใช้bashเท่านั้น
11 bash 

2
ยกมาเทียบกับการขยายตัวสตริงที่ไม่ได้ยกมา
for i in $(xrandr); do echo "$i" ; done for i in "$(xrandr)"; do echo "$i"; done for i in "$(xrandr)"; do echo $i; done ฉันเข้าใจว่าทำไม 1 แตกต่างจาก 2 แต่เหตุใด 3 จึงให้ผลลัพธ์ที่แตกต่างจาก 2 โปรดอธิบายผลลัพธ์ด้วย คำพูดทำงานอย่างไรกับการขึ้นบรรทัดใหม่

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