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

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

3
อะไรคือจุดประสงค์ของ“ ความจริง” ใน bash“ ถ้า sudo จริง แล้ว”
ฉันแฮ็กสคริปสคริปต์นี้พร้อมกันซึ่งทดสอบว่าผู้ใช้มีสิทธิ์พิเศษของผู้ใช้ระดับสูงหรือไม่ ในที่สุดฉันกำลังพยายามกลับคำสั่ง 'ถ้า' ที่สองเพื่อให้ฉันสามารถลบสองบรรทัดต่อไปนี้ (echo "รหัสผ่าน ok" และอื่น ๆ ในบรรทัดต่อไปนี้) # Root user only if [[ "$EUID" != 0 ]]; then sudo -k # make sure to ask for password on next sudo if sudo true; then echo "Password ok" else echo "Aborting script" exit 1 fi fi echo "do …
20 bash  sudo 

5
การพิมพ์เครื่องหมายอัศเจรีย์เดียวทำอะไรใน Bash
Bash ใช้เครื่องหมายอัศเจรีย์สำหรับการขยายประวัติตามที่อธิบายในคำตอบสำหรับคำถามนี้ (เช่นsudo !!เรียกใช้บรรทัดคำสั่งก่อนหน้าด้วยsudo) อย่างไรก็ตามฉันไม่พบที่ใดก็ได้ที่อธิบายสิ่งที่เรียกใช้คำสั่งต่อไปนี้ (เช่นเครื่องหมายอัศเจรีย์): ! ดูเหมือนว่าจะพิมพ์อะไรและออกด้วย 1 แต่ฉันไม่แน่ใจว่าทำไมมันถึงทำอย่างนั้น ฉันดูออนไลน์และในหน้า Bash man แต่ไม่พบอะไรเลยนอกจากความจริงที่ว่ามันเป็น "คำสงวน" - แต่เป็นเช่นนั้น}และใช้งานสิ่งนี้: } พิมพ์ข้อผิดพลาด: bash: syntax error near unexpected token `}'

2
ทางลัดสำหรับการดำเนินการชุดคำสั่งในประวัติทุบตีอยู่หรือไม่?
สมมติว่าฉันมีตัวอย่างเล็ก ๆ น้อย ๆ ต่อไปนี้ในhistory: ... 76 cd ~ 77 ./generator.sh out.file 78 cp out.file ~/out/ 79 ./out/cleaner.sh . 80 ls -alnh /out ... ถ้าผมต้องการที่จะรันคำสั่ง77, 78และ79ในคำสั่งอย่างใดอย่างหนึ่งไม่มีอยู่ทางลัดสำหรับการนี้หรือไม่? ฉันได้ลอง!77 !78 !79แล้วซึ่งจะทำให้พวกเขาทั้งหมดในบรรทัดเดียวเพื่อดำเนินการ

2
ทำไมพฤติกรรมของ `คำสั่ง 1> file.txt 2> file.txt` ต่างจาก` คำสั่ง 1> file.txt 2> & 1`
เมื่อคุณต้องการเปลี่ยนเส้นทางทั้ง stdout และ stderr ไปยังแฟ้มเดียวกันคุณสามารถทำมันได้โดยการใช้หรือcommand 1>file.txt 2>&1 command &>file.txtแต่ทำไมพฤติกรรมcommand 1>file.txt 2>file.txtต่างไปจากสองคำสั่งข้างต้น? ต่อไปนี้เป็นคำสั่งการตรวจสอบ $ cat redirect.sh #!/bin/bash { echo -e "output\noutput" && echo -e "error" 1>&2; } 1>file.txt 2>&1 { echo -e "output\noutput" && echo -e "error" 1>&2; } 1>file1.txt 2>file1.txt { echo -e "error" 1>&2 && echo -e "output\noutput"; } …

3
ฉันจะดูได้อย่างไรว่าคำสั่งใดทำงานในเชลล์ผ่านนามแฝงหรือฟังก์ชั่น
ฉันมีฟังก์ชั่นทุบตี (หรือนามแฝง) function install() {sudo apt-get install $@}ตัวอย่างเช่น เมื่อใช้คำสั่งสิ่งที่ผมคาดว่าจะจริงจะทำงานเป็นinstall dicelab sudo apt-get install dicelabฉันจะดูได้ว่าอะไรที่เชลล์ใช้งานจริง? ฉันต้องการตรวจสอบให้แน่ใจว่านามแฝงที่ซับซ้อนของฉันทำงานได้ตามที่คาดไว้
20 bash  shell  debugging 

1
Grep ช้าที่จะออกหลังจากพบการแข่งขัน?
ฉันกำลังพยายามเขียนสคริปต์ทุบตีที่สำรวจ btmon สำหรับการเชื่อมต่ออุปกรณ์ ฉันมีวิธีแก้ปัญหาการทำงาน แต่มันช้าอย่างไร้เหตุผลและดูเหมือนว่าปัญหาคือ grep ช้ามากที่จะออกหลังจากพบการแข่งขัน (ประมาณ 25 วินาที) ฉันจะทำอย่างไรเพื่อเร่งความเร็วgrepหรือหลีกเลี่ยงการใช้งานพร้อมกัน? #!/bin/bash COUNTER=0 while : do until btmon | grep -m 1 '@ Device Connected' do : done let COUNTER=COUNTER+1 echo on 0 | cec-client RPI -s -d 1 sleep 5 echo as | cec-client RPI -s -d 1 until …
20 bash  grep 

4
ปลอดภัยหรือไม่ที่จะใช้ `เสียงสะท้อน '
การใช้งานevalมักจะหมดกำลังใจเพราะจะทำให้สามารถเรียกใช้รหัสโดยอำเภอใจได้ อย่างไรก็ตามถ้าเราใช้eval echoดูเหมือนว่าส่วนที่เหลือของสตริงจะกลายเป็นข้อโต้แย้งechoดังนั้นมันควรจะปลอดภัย ฉันถูกต้องหรือไม่
20 bash  echo 

2
คำพูดซ้อนคู่ในหนึ่งคะแนนโหวตสูง
คำตอบ StackOverflow ด้วย> 3.5K โหวตให้คุณสมบัติหนึ่งซับสำหรับการกำหนดไปDIRยังไดเรกทอรีของสคริปต์ทุบตีปัจจุบัน: DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" ฉันงงกับคำพูดซ้อนคู่ เท่าที่ฉันสามารถบอกได้ชิ้นส่วนต่อไปนี้เป็นเครื่องหมายคำพูดคู่: "$( cd " "${BASH_SOURCE[0]}" " && pwd )" ... และทุกอย่างอื่นทางด้านขวาของ=(เช่น$( dirnameและ)) ไม่มีการอ้างอิง ในคำอื่น ๆ ฉันคิดว่าตัวละครที่ 2, 4 และ 6 ""ปิด" ตัวที่ 1, 3 และ 5 "ตามลำดับ ฉันเข้าใจว่าการเสนอราคาสองเท่าในการ"${BASH_SOURCE[0]}"บรรลุผลสำเร็จ แต่อะไรคือจุดประสงค์ของการเสนอราคาสองคู่อื่น ๆ หากในอีกทางหนึ่ง (และคะแนนโหวตสูงถึงแม้จะมี) ตัวอย่างข้างต้นไม่ถูกต้องสิ่งที่เป็นวิธีที่เหมาะสมเพื่อให้บรรลุเจตนาที่ระบุ? (โดยเจตนาที่ระบุฉันหมายถึง: รวบรวมค่าที่ส่งคืนโดยpwdหลังจากการcdเข้าสู่ไดเรกทอรีที่ส่งคืนโดยครั้งแรกdirname …

4
บางครั้งคำสั่งประวัติจะไม่ถูกเก็บไว้ใน. bash_history
ฉันออกคำสั่งมากมายเมื่อวานนี้ใน CentOS 7 ของฉัน แต่เมื่อฉันต้องการเรียกคำสั่งเหล่านี้วันนี้ฉันพบว่าไม่มีบันทึกใด ๆ เมื่อฉันเปิดไฟล์.bash_historyฉันยังไม่พบคำสั่งที่ฉันใช้เมื่อวานนี้ แต่ฉันพบคำสั่งเก่า ๆ หลายครั้งเมื่อไม่กี่วันที่ผ่านมา เหตุใดคำสั่งล่าสุดจึงไม่ถูกจัดเก็บ ฉันจะเพิ่มความสามารถด้านประวัติศาสตร์ได้อย่างไร?

6
ฉันจะป้อน n ซ้ำของตัวเลขในทุบตีโต้ตอบได้อย่างไร
ฉันต้องการเรียกใช้คำสั่ง foo --bar=baz <16 zeroes> ฉันจะพิมพ์ 16 ศูนย์ได้อย่างมีประสิทธิภาพได้อย่างไร ถ้าฉันAltกดค้างไว้1 6 0มันจะทำซ้ำสิ่งต่อไป 160 ครั้งซึ่งไม่ใช่สิ่งที่ฉันต้องการ ใน emacs ฉันสามารถใช้Alt-[number]หรือCtrl-u 1 6 Ctrl-u 0แต่ในทุบตีCtrl-uฆ่าสายที่ถูกพิมพ์ในขณะนี้และศูนย์ต่อไปเพียงแค่เพิ่ม 0 ลงในบรรทัด ถ้าฉันทำ foo --bar=baz $(printf '0%.0s' {1..16}) จากนั้นhistoryแสดงให้เห็นอย่างชัดเจนข้างต้นและไม่foo --bar=baz 0000000000000000; ie bash ไม่ทำงานในแบบที่ฉันต้องการ ( แก้ไข : เป็นจุดฉันต้องการที่จะใส่จำนวนศูนย์โดยไม่ต้องใช้การ$(...)ทดแทนคำสั่ง) (*) ฉันเดาว่าคำจำกัดความทางเทคนิคของ "มีประสิทธิภาพ" คือ "กับการกดแป้นพิมพ์ O (log n)" โดยเฉพาะอย่างยิ่งการกดแป้นจำนวนหนึ่งเท่ากับจำนวนหลักใน 16 (สำหรับค่าทั้งหมด 16) …

5
เหตุใดจึงมี EOF กลางข้อโต้แย้ง?
ฉันต้องการเขียนฟังก์ชั่นทุบตีเล็ก ๆ น้อย ๆ เช่นที่ฉันสามารถบอก bash import osหรือfrom sys import stdoutมันจะวางไข่ล่าม Python ใหม่ด้วยโมดูลที่นำเข้า fromฟังก์ชั่นหลังมีลักษณะเช่นนี้: from () { echo "from $@" | xxd python3 -i -c "from $@" } ถ้าฉันเรียกสิ่งนี้: $ from sys import stdout 00000000: 6672 6f6d 2073 7973 2069 6d70 6f72 7420 from sys import 00000010: 7374 646f 7574 …
20 bash  python 

3
`<& -` ทำอะไร
ฉันคัดลอกตัวอย่างของ Bash ไปยังพื้นหลังคำสั่ง ssh ที่ดำเนินการจากระยะไกล: ssh user@remote &lt;&lt;CMD some process &lt;&amp;- &gt;log 2&gt;error &amp; CMD อะไร&lt;&amp;-ทำอย่างไร ฉันเดาว่ามันเหมือนกับ&lt; /dev/null ความเข้าใจต่อไปของฉันอยู่ที่สามอธิบายไฟล์หลัก ( stdin, stdout, stderr) จะต้องมีการปิดเพื่อป้องกัน: งานที่อยู่เบื้องหลังและออกจากสคริปต์ - ขัดแย้งกันอย่างไร? เมื่อปิดเทอร์มินัลกระบวนการทั้งหมดที่ยอมรับ stdin จากเทอร์มินัลจะปิด?

2
การแสดงออกวงเล็บ (ไม่มีช่วง) จับคู่ตัวละครที่ไม่คาดคิดในทุบตี
ฉันใช้ทุบตีบน Linux ฉันได้รับความสำเร็จจากคำสั่ง if ต่อไปนี้ แต่ไม่ควรส่งคืนรหัสที่ล้มเหลวหรือ if [[ ■ = [⅕⅖⅗] ]] ; then echo yes ; fi สี่เหลี่ยมจัตุรัสไม่เท่ากับอักขระใด ๆ ดังนั้นฉันจึงไม่เห็นสาเหตุที่ฉันได้รหัสสำเร็จ เป็นสิ่งสำคัญสำหรับฉันที่จะเก็บวงเล็บคู่ไว้ในกระเป๋า มีวิธีอื่นที่จะทำช่วงในสถานการณ์นี้หรือคำแนะนำอื่น ๆ ?
20 bash  locale  test 

2
จะหยุดทุบตีแก้ไขประวัติเมื่อฉันนำมาใช้ใหม่และแก้ไขรายการได้อย่างไร
อินสแตนซ์ของการทุบตีบางอย่างเปลี่ยนประวัติคำสั่งเมื่อคุณใช้ซ้ำและแก้ไขคำสั่งก่อนหน้า ฉันค้นหาและค้นหา แต่ไม่พบสิ่งใดที่บอกว่าจะป้องกันคำสั่งในประวัติจากการแก้ไขเมื่อพวกเขาถูกนำมาใช้ซ้ำและแก้ไขได้ มีคำถามเช่นนี้แต่ดูเหมือนว่าจะพูดถึงวิธีรับมือกับประวัติศาสตร์ที่ถูกแก้ไข ฉันเพิ่งเจออินสแตนซ์ของ bash ที่แก้ไขประวัติเมื่อคุณใช้คำสั่งซ้ำ - bash shell ก่อนหน้านี้ทั้งหมดที่ฉันเคยใช้มี (เท่าที่ฉันสังเกตเห็น) ได้รับการกำหนดค่าไม่ให้เปลี่ยนประวัติเมื่อคุณใช้ซ้ำ และแก้ไขคำสั่ง (บางทีฉันแค่ไม่ได้ให้ความสนใจอย่างถูกต้องกับประวัติเชลล์ของฉันในช่วง 15 ปีที่ผ่านมาหรือมากกว่านั้น ... ) ดังนั้นนั่นอาจเป็นคำถามที่ดีที่สุด: ฉันสามารถบอกทุบตีไม่เคยแก้ไขประวัติ - และถ้าเป็นเช่นนั้นได้อย่างไร


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