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

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

3
ทำไมไม่ `|` ได้รับการปฏิบัติอย่างแท้จริงในรูปแบบกลม?
คำถามของฉันมาจากการจัดเก็บการแสดงออกปกติในตัวแปรเปลือกหลีกเลี่ยงปัญหาเกี่ยวกับการอ้างอิงตัวอักษรที่พิเศษให้กับเชลล์ได้อย่างไร . ทำไมมีข้อผิดพลาด: $ [[ $a = a|b ]] bash: syntax error in conditional expression: unexpected token `|' bash: syntax error near `|b' ภายใน[[ ... ]]ตัวถูกดำเนินการตัวที่สองของ=คาดว่าจะเป็นรูปแบบกลม คือa|bไม่ใช่รูปแบบ globbing ที่ถูกต้อง? คุณช่วยชี้ให้เห็นว่ามันละเมิดกฎไวยากรณ์หรือไม่ ความคิดเห็นบางส่วนด้านล่างชี้ให้เห็นว่า|ถูกตีความว่าเป็นไปป์ แล้วเปลี่ยน=สำหรับรูปแบบ glob ไป=~สำหรับ regex รูปแบบทำให้ |การทำงาน $ [[ $a =~ a|b ]] ฉันเรียนรู้จากLearning Bash p180 ในโพสต์ก่อนหน้าของฉันซึ่ง|เป็นที่รู้จักในฐานะจุดเริ่มต้นของการตีความแม้กระทั่งก่อนการตีความขั้นตอนอื่น ๆ (รวมถึงการแยกวิเคราะห์การแสดงออกตามเงื่อนไขในตัวอย่าง) ดังนั้น …
13 bash 

2
รันคำสั่ง bash หลังจากคำสั่งพร้อมกันไหม?
ฉันต้องการเรียกใช้คำสั่งแบบขนาน เมื่อคำสั่งทั้งหมดเหล่านี้เสร็จสิ้นให้เริ่มต้นคำสั่งถัดไป ฉันว่าแนวทางต่อไปนี้จะได้ผล #!/bin/bash command1 & command2 & command3 && command4 แต่มันก็ไม่ได้ ฉันจำเป็นต้องเรียกใช้command4เมื่อคำสั่งสามคำแรกเสร็จสิ้นสมบูรณ์

2
ทางลัดเดียวเพื่อส่งต่อการค้นหาหลังจากค้นหา Ctrl-R ย้อนกลับ
ฉันใช้Ctrl+ Rตลอดเวลา แต่บ่อยครั้งที่ฉันต้องผ่านคำสั่งที่ฉันตามมาเพราะฉันกดมันเร็วเกินไป เพื่อส่งต่อการค้นหาCtrl+ Sสามารถใช้บริการที่มีให้ก็ไม่ได้ใช้สถานีแรก (konsole ในกรณีของฉันซึ่งstty -ixonใน~/.bashrcการแก้ไขได้) อย่างไรก็ตามฉันต้องกดสองครั้ง: เมื่อดูเหมือนว่าจะเข้ามาi-searchหลังจากอยู่ในreverse-i-searchโหมดและครั้งที่สองที่จะย้อนกลับจริง ๆ มีวิธีลบความจำเป็นในการกดปุ่มลัดสองครั้งหรือไม่?

6
การตรวจสอบความถูกต้องของไบนารีคำสั่งก่อนดำเนินการ
มีวิธีการตรวจสอบสิ่งที่คุณกำลังดำเนินการจากสคริปต์ทุบตีจริง ๆ ? บอกว่าทุบตีสคริปต์ของคุณจะถูกเรียกหลายคำสั่ง (ตัวอย่างเช่น: tar, mail, scp, mysqldump) และคุณยินดีที่จะให้แน่ใจว่าtarเป็นจริงจริงtarซึ่งเป็นที่ระบุโดยrootผู้ใช้เป็นไฟล์และไดเรกทอรีแม่เจ้าของและเป็นคนเดียวที่มีสิทธิ์ในการเขียน และไม่ได้/tmp/surprise/tarมีwww-dataหรือapache2เป็นเจ้าของ แน่ใจว่าฉันรู้เกี่ยวกับPATHสภาพแวดล้อมและฉันอยากรู้ว่านี้สามารถตรวจสอบเพิ่มเติมจากสคริปต์ทุบตีทำงานและถ้าเป็นเช่นนั้นได้อย่างไร ตัวอย่าง: (หลอกรหัส) tarfile=$(which tar) isroot=$(ls -l "$tarfile") | grep "root root" #and so on...

8
การย้อนกลับเนื้อหาของตัวแปรด้วยคำพูด
ดังนั้นถ้าฉันมีตัวแปร VAR='10 20 30 40 50 60 70 80 90 100' และสะท้อนออกมา echo "$VAR" 10 20 30 40 50 60 70 80 90 100 อย่างไรก็ตามยิ่งสคริปต์ฉันต้องย้อนกลับลำดับของตัวแปรนี้จึงแสดงเป็นสิ่งที่ต้องการ echo "$VAR" | <code to reverse it> 100 90 80 70 60 50 40 30 20 10 ฉันพยายามใช้ rev และมันกลับด้านทุกอย่างดังนั้นมันจึงออกมาเป็น echo "$VAR" | rev 001 …
13 linux  bash  shell  variable 

2
เหตุใดราคาจึงจำเป็นสำหรับอาร์กิวเมนต์ไฟล์เมื่อเรียกสคริปต์ Bash นี้
ฉันค่อนข้างใหม่กับการเขียนสคริปต์ Bash ฉันมี "testcript" ซึ่งฉันใช้เป็นพื้นฐานสำหรับสคริปต์ขั้นสูง / มีประโยชน์มากขึ้น: #!/bin/bash files=$1 for a in $files do echo "$a" done เมื่อฉันเรียกสิ่งนี้โดยไม่ใส่เครื่องหมายอัญประกาศมันก็แค่หยิบไฟล์หนึ่งไฟล์ในไดเรกทอรี: testscript *.txt แต่เมื่อฉันเรียกมันด้วยเครื่องหมายคำพูดมันทำงานได้อย่างถูกต้องและเลือกไฟล์ข้อความทั้งหมด: testscript '*.txt' เกิดขึ้นที่นี่คืออะไร?


4
เมื่อใดที่ {a, b, c} ถูกขยายเป็น bash เมื่อใด
สคริปต์ทุบตีที่มี for i in {a,b}-{1,2}; do echo $i; done พิมพ์ a-1 a-2 b-1 b-2 เมื่อดำเนินการ นี่คือสิ่งที่ฉันคาดไว้ - ขณะที่การ{a,b}ก่อสร้างขยายออกไป อย่างไรก็ตามเมื่อสคริปต์ (อื่น) มี v={a,b}-{1,2} echo $v มันพิมพ์ {a,b}-{1,2} ซึ่งไม่ใช่สิ่งที่ฉันคาดหวัง a-1 a-2 b-1 b-2ผมคาดว่ามันจะพิมพ์ เห็นได้ชัดว่าการ{a,b}สร้างไม่ได้ขยาย ฉันสามารถทำให้มันขยายได้อย่างนั้น v=$(echo {a,b}-{1,2}) จากข้อสังเกตเหล่านี้ฉันมีสองคำถาม: 1) {a,b}โครงสร้างจะขยายเมื่อไหร่? 2) เป็น$(echo {a,b}-{1,2})วิธีที่ต้องการเพื่อกระตุ้นการขยายเมื่อต้องการหรือไม่

1
การตั้งค่านามแฝงทุบตีชั่วคราวเมื่อเข้าสู่โฟลเดอร์
บางครั้งฉันชอบที่จะมีนามแฝงทุบตีที่กำหนดเองมากและอาจจะเป็นปุ่มลัดเมื่อฉันป้อนในโฟลเดอร์ (อาจเป็นโครงการที่ฉันเคยพิมพ์คำสั่งจำนวนมากจาก CLI) ให้สมมติว่าเมื่อฉันป้อนโฟลเดอร์เช่น "projectAlpha /" ฉันคาดหวังชื่อแทนที่กำหนดเองเช่น: alias doTaskX='./app arg1 arg2...|filter arg1 arg2...' ... ยิ่งกว่านั้นฉันคิดว่า: แสดงข้อความที่เป็นประโยชน์แสดงนามแฝงและคำสั่งทั่วไป แสดง keybindings ที่กำหนดเองทั่วไปบางอย่างสำหรับโครงการของฉัน แต่ทันทีที่ฉันออกจากโครงการของฉันการตั้งค่าเหล่านี้จะไม่สามารถใช้ได้ วิธีที่ดีที่สุดที่จะทำวันนี้คืออะไร?
13 bash  shell  alias 

2
“ <Esc> Kv” ใน bash คืออะไร
เมื่อผมอยู่ในทุบตีและกดEsc, Shift+ K, Vทุบตียิงขึ้นกับชื่อไฟล์ที่คล้ายกับ$EDITOR/tmp/bash-fc-186566385 ทำไมจึงเป็นและวัตถุประสงค์ของมันคืออะไร? set -o viผมอาจจะต้องพูดถึงว่าฉันทำงานกับทุบตี

4
วางคำสั่งผ่านฟิลเตอร์สี
สิ่งนี้มีอยู่ใน Unix หรือไม่? $ echo "this should show in red" | red $ echo "this should show in green" | green $ echo "this should show in blue" | blue ที่นี่ฉันไม่ได้ตั้งใจให้ข้อความรหัสสีตัวอักษรปรากฏขึ้น (ตัวอย่างเช่นวางในไฟล์) ฉันแค่หมายถึงข้อความที่จะแสดงจริงใน terminal เป็นสีนั้น เป็นไปได้ไหม
13 bash  terminal  colors 

1
การประเมินผลของการขยายตัวทางคณิตศาสตร์ในทุบตี
บรรทัดต่อไปนี้สร้างfile_c-6.txtแต่เอาต์พุต5: $ i=5; ls file_a-${i}.txt file_b-${i}.txt &gt; file_c-$(( ++i )).txt; echo $i 5 $ cat file_c-6.txt file_a-5.txt file_b-5.txt หากลบออก&gt;จะเป็นการแสดงรายการfile_c-6.txtและเอาท์พุท5: ฉันไม่สามารถเข้าใจได้ว่าทำไมมันไม่เก็บค่าของiในตัวอย่างแรก $ i=5; ls file_a-${i}.txt file_b-${i}.txt file_c-$(( ++i )).txt; echo $i file_a-5.txt file_b-5.txt file_c-6.txt 6
13 bash 

2
ทำไม“ bash -x” ถึงทำลายสคริปต์นี้?
ฉันมีสคริปต์ที่วัดระยะเวลาที่คำสั่งดำเนินการ มันต้องการtimeคำสั่ง"ของจริง" ความหมายไบนารีเป็นตัวอย่างใน/usr/bin/time(เนื่องจาก bash-built-in ไม่มี-fแฟล็ก) ด้านล่างสคริปต์แบบง่ายซึ่งสามารถดีบั๊กได้: #!/bin/bash TIMESEC=$(echo blah | ( /usr/bin/time -f %e grep blah &gt;/dev/null ) 2&gt;&amp;1 | awk -F. '{print $1}') echo ABC--$TIMESEC--DEF if [ "$TIMESEC" -eq 0 ] ; then echo "we are here!" fi บันทึกเป็น "test.sh" และดำเนินการ: $ bash test.sh ABC--0--DEF we are here! ดังนั้นมันจึงทำงานได้ …

5
ฉันจะทำให้สคริปต์นี้มีข้อผิดพลาดในการออกจากผลของลูปได้อย่างไร
ฉันมีสคริปต์ทุบตีซึ่งใช้set -o errexitเพื่อให้เกิดข้อผิดพลาดสคริปต์ทั้งหมดออกจากที่จุดของความล้มเหลว สคริปต์รันcurlคำสั่งซึ่งบางครั้งล้มเหลวในการดึงไฟล์ที่ต้องการ - อย่างไรก็ตามเมื่อเกิดเหตุการณ์นี้สคริปต์จะไม่เกิดข้อผิดพลาดในการออก ฉันได้เพิ่มการforวนซ้ำไป หยุดชั่วครู่หนึ่งแล้วลองcurlคำสั่งอีกครั้ง ใช้falseที่ด้านล่างของ for for loop เพื่อกำหนดสถานะการออกไม่เป็นศูนย์เริ่มต้น - หากคำสั่ง curl สำเร็จ - การแบ่งลูปและสถานะการออกของคำสั่งสุดท้ายควรเป็นศูนย์ #! /bin/bash set -o errexit # ... for (( i=1; i&lt;5; i++ )) do echo "attempt number: "$i curl -LSso ~/.vim/autoload/pathogen.vim https://tpo.pe/pathogen.vim if [ -f ~/.vim/autoload/pathogen.vim ] then echo "file has …

2
วิธีแสดงอักขระควบคุม (^ C, ^ D, ^ [, …) ในเชลล์แตกต่างกัน
เมื่อคุณพิมพ์อักขระควบคุมในเชลล์พวกมันจะปรากฏขึ้นโดยใช้สิ่งที่เรียกว่า "เครื่องหมายรูปสัณฐานวิทยา" หลบหนีเช่นได้รับการเขียน^[ในรูปสัญกรณ์ ฉันชอบปรับแต่ง bash shell ของฉันเพื่อทำให้มันดูเท่ห์ ตัวอย่างเช่นฉันเปลี่ยนของฉันPS1และPS2กลายเป็นสี ตอนนี้ฉันต้องการให้ตัวควบคุมมีลักษณะที่ไม่เหมือนใครและทำให้พวกมันแตกต่างจากตัวละครปกติมากขึ้น $ # Here I type CTRL-C to abort the command. $ blahblah^C ^^ I want these two characters to be displayed differently มีวิธีที่ทำให้ตัวควบคุมไฮไลท์เปลือกของฉันแตกต่างไปจากนี้หรือไม่ เป็นไปได้หรือไม่ที่จะทำให้มันแสดงเป็นตัวหนาหรืออาจทำให้มันปรากฏเป็นสีต่าง ๆ จากข้อความปกติ? ฉันกำลังใช้bash shell ที่นี่ แต่ฉันไม่ได้ติดแท็กคำถามด้วยbashเพราะอาจมีวิธีแก้ปัญหาที่ใช้กับเชลล์ที่แตกต่างกันจำนวนมาก โปรดทราบว่าฉันไม่ทราบว่าจะเน้นการควบคุมอักขระที่ระดับใด ฉันแรกคิดว่ามันอยู่ในเปลือกตัวเอง ตอนนี้ผมเคยได้ยินว่ามันเป็นที่ ReadLineว่าการควบคุมวิธีการควบคุมตัวอักษรที่อยู่ในเปลือกหอยเช่นทุบตี ดังนั้นตอนนี้คำถามจะถูกแท็กด้วยreadlineและฉันยังคงมองหาคำตอบ

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