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

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

2
วิธีการหลีกเลี่ยงพื้นที่หลังจากตัวแปร bash ในสตริง?
ฉันมีตัวแปรสำหรับสี ฉันใช้มันเพื่อตั้งค่าสีเป็นสตริงโดยการประเมินมันภายในสตริง อย่างไรก็ตามฉันต้องรวมช่องว่างหลังชื่อ (เพื่อให้ชื่อไม่มีส่วนของข้อความ) บางครั้งมันก็ดูไม่ดี ฉันจะหลีกเลี่ยงการใช้ (การพิมพ์) พื้นที่นี้ได้อย่างไร ตัวอย่าง (สมมติว่าอย่างนั้นRed=1และNC=2): echo -e "$Red Note: blabla$NC". เอาท์พุท: 1 Note: blabla2. ผลลัพธ์ที่คาดหวัง: 1Note: blabla2.

1
ทำไมคำสั่ง ffmpeg นี้ทำงานใน bash ไม่ใช่ zsh?
วันนี้ฉันกลับถึงบ้านจากที่ทำงาน (เรียกใช้ทุบตีบนกล่อง Ubuntu) และพยายามที่จะเรียกใช้โค้ดบางอย่างบนกล่องซุ้มประตูท้องถิ่นของฉันด้วย zsh ที่รักของฉันและคำสั่งล้มเหลว? คำสั่งด้านล่างพร้อมข้อมูลส่วนบุคคลและ ip มีการเปลี่ยนแปลงอย่างชัดเจน ffmpeg -i rtsp://user:pass@my.webserver.org:5554/my-media/media.amp?videocodec=h264 -threads 3 -vcodec copy -f segment -segment_time 2 outfiles/cam_out%04d.mp4 มันทำงานได้อย่างสมบูรณ์แบบในการทุบตี แต่เมื่อฉันรันใน zsh ฉันได้รับข้อผิดพลาด zsh: no matches found: rtsp://user:pass@my.webserver.org:5554/my-media/media.amp?videocodec=h264 ทำไม zsh ที่รักของฉันทรยศฉัน
17 bash  zsh  quoting  url 

3
ความแตกต่างระหว่าง {1,2,3} และ {1..3}
มีความแตกต่างระหว่างลำดับ{1,2,3}และ{1..3}? เช่นถ้าฉันมีไฟล์บางไฟล์ file.1 file.2 file.3 และฉันต้องการให้catพวกเขาเข้าด้วยกันมันปลอดภัยที่จะใช้cat file.{1..3} > file? สิ่งที่ฉันรู้คือcat file.*>fileอาจทำให้เกิดปัญหาเนื่องจากเชลล์สามารถขยายไฟล์แบบสุ่มในบางครั้ง (ฉันคิดว่ามันขึ้นอยู่กับ inodes ใช่ไหม?)
17 bash 

6
ใช้คำสั่งระบบแทน Bash builtin โดยไม่ระบุพา ธ เต็ม
ฉันใช้ Bash เป็นเชลล์เชิงโต้ตอบของฉันและฉันสงสัยว่ามีวิธีง่ายๆในการทำให้ Bash เรียกใช้คำสั่งระบบแทนคำสั่ง shell builtin ในกรณีที่พวกเขาทั้งสองใช้ชื่อเดียวกันร่วมกัน ตัวอย่างเช่นใช้ระบบkill(จากutil-linux) เพื่อพิมพ์รหัสกระบวนการ (pid) ของกระบวนการที่ระบุชื่อ (es) แทนการส่งสัญญาณ: $ /bin/kill -p httpd 2617 ... โดยไม่ระบุพา ธ แบบเต็มของคำสั่งระบบ Bash builtin จะถูกใช้แทนคำสั่งระบบ killbuiltin ไม่ได้มี-pตัวเลือกเพื่อให้คำสั่งล้มเหลว: $ kill -p httpd bash: kill: p: invalid signal specification ฉันพยายามตอบที่ระบุไว้ในทำให้การใช้งานภายนอกทุบตี `คำสั่ง time` มากกว่าเปลือก builtinแต่ส่วนใหญ่ของพวกเขาทำงานเพียงเพราะtimeเป็นจริงเปลือกคำหลัก - ไม่เปลือกbuiltin นอกเหนือจากการปิดการใช้งาน Bash builtin ชั่วคราวenable -n …

3
วิธีเรียกใช้การวนซ้ำไม่สิ้นสุดในพื้นหลัง
ฉันจะเรียกใช้วนรอบไม่สิ้นสุดในพื้นหลังในขณะที่ดำเนินการสคริปต์ต่อไปได้อย่างไร ตัวอย่าง "script": while true; do something_in_the_background; done do_something_while_the_loop_goes_on_in_the_background for 1 2 3; do somethingelse; done exit 0 สิ่งนี้ (สังเกตเห็น&) ดูเหมือนว่าจะผิดพลาดทั้งระบบหลังจากนั้นครู่หนึ่ง: while true; do something_in_the_background & done do_something_while_the_loop_goes_on_in_the_background for 1 2 3; do somethingelse; done exit 0
17 bash 

4
อินพุตมาตรฐานของโปรแกรมหนึ่งสามารถส่งผ่านเป็นอาร์กิวเมนต์ไปยังโปรแกรมอื่นได้อย่างไร
สมมติว่ามีโปรแกรมอยู่ซึ่งใช้เวลาสองข้อโต้แย้ง ไฟล์อินพุตและไฟล์เอาต์พุต จะเกิดอะไรขึ้นถ้าฉันไม่ต้องการบันทึกไฟล์เอาต์พุตนี้ลงในดิสก์ แต่จะผ่านมันไปยังstdinโปรแกรมอื่นโดยตรง มีวิธีที่จะบรรลุเป้าหมายนี้หรือไม่? คำสั่งจำนวนมากที่ฉันเจอบน Linux มีตัวเลือกให้ส่งผ่าน '-' เป็นอาร์กิวเมนต์ไฟล์เอาต์พุตซึ่งทำสิ่งที่ฉันได้ระบุไว้ด้านบน เป็นเพราะการผ่านstdinโปรแกรมเป็นอาร์กิวเมนต์เป็นไปไม่ได้? ถ้าเป็นเช่นนั้นเราจะทำอย่างไร ตัวอย่างของการใช้ภาพนี้คือ: pdftotext "C BY BRIAN W KERNIGHAN & DENNIS M RITCHIE.pdf" stdin(echo) เชลล์ที่ฉันใช้อยู่นั้นมันทุบตี

1
มันเป็นพฤติกรรมมาตรฐานสำหรับซีดีที่จะเลือกโดยอัตโนมัติเมื่อได้รับชื่อไดเรกทอรีที่ไม่สมบูรณ์?
ฉันมีสามโฟลเดอร์ที่เรียกว่าProjectA, และProjectB ProjectCเมื่อฉันtabสมบูรณ์cdไปcd ProjectและกดมันเลือกEnter ProjectCฉันพบว่านี่เป็นกรณีที่มีกรณีอื่นที่คล้ายคลึงกัน; มันเริ่มต้นที่ล่าสุดในการสั่งซื้อพจนานุกรม (แต่นี่ก็อาจมีการเปลี่ยนแปลง / เพิ่มล่าสุด) นี่เป็นพฤติกรรมเริ่มต้นที่คาดไว้สำหรับcdหรือฉันตั้งบางสิ่งบางอย่างโดยบังเอิญ ฉันใช้ OSX 10.10.3 กับทุบตี 4.3

4
ช่องว่างถัดจากท่อ
ฉันเคยเห็นhistory | grep blahและhistory |grep blah; และใช้history|grep blahงานได้แม้ว่าจะไม่มีใครดูเหมือนจะใช้มัน มีความสำคัญในช่องว่างหรือไม่ (เช่นการไพพ์ไปยัง / จากคำสั่งที่แตกต่างกันต้องใช้การเว้นวรรคที่แตกต่างกัน) หรือมันเป็นกฎเกณฑ์เสมอ?
17 bash  shell  pipe 

3
การเรียกใช้สคริปต์ sh: «การอนุญาตถูกปฏิเสธ»แม้จะมีบิตและรูทที่สามารถเรียกทำงานได้
ฉันติดตั้ง Debian ในVirtualBox (สำหรับการทดลองต่าง ๆ ซึ่งโดยปกติแล้วระบบของฉัน) และพยายามที่จะเปิดตัวสคริปต์ addon ของแขก VirtualBox ฉันเข้าสู่ระบบในฐานะ root และพยายามที่จะเปิดตัวautorun.shแต่ฉันได้รับ«การอนุญาตถูกปฏิเสธ» ls -lแสดงให้เห็นว่าสคริปต์มีสิทธิ์ดำเนินการ ขออภัยที่ฉันไม่สามารถคัดลอกผลลัพธ์ - VirtualBox ไม่มีประโยชน์อย่างแน่นอนหากไม่มี addon ไม่ว่าจะเป็นไดเรกทอรีที่ใช้ร่วมกันหรือคลิปบอร์ดที่ใช้ร่วมกันไม่ได้ แต่เพื่อให้แน่ใจว่าฉันคัดลอกสิทธิ์ด้วยมือ: #ls -l ./autorun.sh -r-xr-xr-x 1 root root 6966 Mar 26 13:56 ./autorun.sh ตอนแรกฉันคิดว่าอาจเป็นเพราะสคริปต์ดำเนินการบางอย่างที่ทำให้เกิดข้อผิดพลาด ฉันพยายามแทนที่/bin/shด้วยสิ่งที่ชอบ#/pathtorealsh/sh -xvแต่ฉันไม่ได้ผลลัพธ์ - ดูเหมือนว่าสคริปต์จะไม่สามารถดำเนินการได้ ฉันยังไม่ทราบเลยว่าอะไรจะทำให้เกิด

2
จะเรียกนามแฝงที่หายไปได้อย่างไร
ฉันสร้างคำสั่ง echo ไปที่ไฟล์. bash_aliases ของฉันและลบนามแฝงทั้งหมดของฉันยกเว้น alias ทดสอบ อย่างไรก็ตามฉันยังคงเปิดเซสชันที่มีชื่อแทนโหลดไว้ (ใน tcl?) ฉันสามารถดึงพวกมันออกจากเซสชั่นนี้ได้หรือไม่?

2
วิธีรับชื่อของผู้ใช้ที่รันสคริปต์ bash เป็น sudo
ฉันต้องการสร้างสคริปต์ทุบตีที่ต้องดำเนินการด้วย sudo แต่ควรคำนึงถึงชื่อของผู้ใช้ที่ไม่ใช่ sudo ที่ดำเนินการ ดังนั้นหากผู้ใช้bobรันsudo ./myscript.shฉันอยากmyscript.shรู้bobเป็นผู้ดำเนินการ ลองดูข้างในmyscript.sh: USER=$(whoami) # Do something that takes into account the username. ฉันจะทราบชื่อของผู้ใช้ที่วางกระบวนการได้อย่างไร โดยเฉพาะอย่างยิ่งสิ่งที่ฉันควรใช้แทนที่จะwhoamiได้รับbobและไม่root?

4
แจ้งให้ผู้ใช้ล็อกอินเป็นรูทเมื่อรันเชลล์สคริปต์
ปัญหาที่ฉันได้รับคือเมื่อฉันป้อนคำสั่ง su - root ที่จุดเริ่มต้นของไฟล์เชลล์สคริปต์ของฉันจะแจ้งให้ผู้ใช้ป้อนรหัสผ่านและจากนั้นจะไม่ดำเนินการกับสคริปต์เชลล์ส่วนที่เหลือต่อไป ฉันต้องค้นหาด้วยตนเองและเรียกใช้เชลล์สคริปต์ผ่านเทอร์มินัล ฉันต้องการสคริปต์เพื่อให้แน่ใจว่าผู้ใช้เข้าสู่ระบบในฐานะ root แล้วดำเนินการต่อกับส่วนที่เหลือของสคริปต์เชลล์ กล่าวอีกนัยหนึ่งฉันต้องการเรียกใช้สคริปต์ในฐานะผู้ใช้ใด ๆ แต่ทันทีที่สคริปต์เริ่มดำเนินการผู้ใช้จะต้องเปลี่ยนเป็นรูทแล้วดำเนินการต่อโดยใช้สคริปต์ที่เหลือเป็นรูทจนกว่าจะเสร็จ สามารถทำได้หรือไม่

2
อาร์กิวเมนต์ '-v' และ '-x' หมายถึงการทุบตีอย่างไร
ฉันได้เห็นเชลล์สคริปต์สองสามตัวด้วย shebang ต่อไปนี้ #!/bin/bash -x -v แต่man bashไม่ได้อธิบายสิ่งที่ขัดแย้งเหล่านี้-xและ-vยืนถ้าพวกเขาจะเป็นของbashที่ทุกคน ดังนั้นสิ่งเหล่านั้น-xและ-v(และข้อโต้แย้งที่เป็นไปได้อื่น ๆ ) หมายความว่าอย่างไร
17 bash  shebang 

2
แทนที่ backtick ด้วย $ () ไม่ทำงาน
ฉันมีสคริปต์เก่าที่ฉันพยายามอัปเดต บางส่วนของรหัสควบแน่นไปที่: export X=`(echo "abc"; echo "def")` echo $X ซึ่งให้ผลลัพธ์ที่คาดหวัง: abc def ตอนนี้อินเทอร์เน็ตบอกฉันว่า backticks ออกมา$()เป็นสิ่งที่ฉันต้องการใช้ แต่เมื่อฉันลอง: export X=$((echo "abc"; echo "def")) X ไม่ได้ตั้งค่าและฉันได้รับข้อผิดพลาด: bash: echo "abc"; echo "def": syntax error: invalid arithmetic operator (error token is ""abc"; echo "def"") ผมทำอะไรผิดหรือเปล่า?
17 bash 

3
ทำไมเครื่องหมายน้อยกว่าไม่ทำงานแทนแมวในทุบตี?
ฉันได้ยินเกี่ยวกับ "การใช้แมวที่ไร้ประโยชน์" และพบคำแนะนำบางอย่าง แต่ผลลัพธ์ต่อไปนี้ไม่มีอะไรในเปลือก bash ของฉัน < filename การใช้แมวทำงานได้ตามที่คาดหวัง cat filename ฉันใช้ Fedora Core 18 และ GNU ทุบตีรุ่น 4.2.45 (1) แก้ไข: การใช้งานที่ด้านหน้าของไปป์ไม่ทำงานเช่นกัน < filename | grep pattern ในขณะที่ใช้แมวทำงานตามที่คาดไว้ cat filename | grep pattern แก้ไข 2: เพื่อชี้แจงฉันรู้ว่าฉันสามารถใช้สิ่งนี้ grep pattern < filename แต่ฉันอ่านที่นี่/programming/11710552/useless-use-of-catว่าฉันยังสามารถใช้หน้าคำสั่ง มันไม่ทำงานต่อหน้าคำสั่งแม้ว่า

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