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

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


6
อะไรคือความแตกต่างระหว่างโอเปอเรเตอร์ Bash [[vs [vs (vs (vs))
ฉันสับสนเล็กน้อยเกี่ยวกับสิ่งที่ตัวดำเนินการเหล่านี้ทำแตกต่างกันเมื่อใช้ในการทุบตี [[ , [ , ( , (( ฉันเคยเห็นคนใช้พวกเขาถ้างบเช่นนี้: if [[condition]] if [condition] if ((condition)) if (condition)
245 bash  shell  test 

8
ฉันจะทดสอบได้อย่างไรว่าตัวแปรว่างเปล่าหรือมีช่องว่างเท่านั้น?
ไวยากรณ์ bash ต่อไปนี้ตรวจสอบว่าparamไม่ว่างเปล่า: [[ ! -z $param ]] ตัวอย่างเช่น: param="" [[ ! -z $param ]] && echo "I am not zero" ไม่มีการส่งออกและปรับ แต่เมื่อparamว่างเปล่ายกเว้นอักขระเว้นวรรคหนึ่งตัว (ขึ้นไป) เคสจะแตกต่างกัน: param=" " # one space [[ ! -z $param ]] && echo "I am not zero" เอาท์พุท "ฉันไม่ได้เป็นศูนย์" ฉันจะเปลี่ยนการทดสอบเพื่อพิจารณาตัวแปรที่มีอักขระเว้นวรรคว่างเปล่าได้อย่างไร

5
env x = '() {:;}; ทุบตีคำสั่งทำและทำไมมันไม่ปลอดภัย?
เห็นได้ชัดว่ามีช่องโหว่ (CVE-2014-6271) ใน bash: Bash ที่สร้างขึ้นเป็นพิเศษสำหรับการโจมตีการฉีดโค้ดตัวแปรสภาพแวดล้อม ฉันพยายามที่จะคิดออกว่าเกิดอะไรขึ้น แต่ฉันไม่แน่ใจว่าฉันเข้าใจ จะสามารถechoดำเนินการตามที่อยู่ในเครื่องหมายคำพูดเดียวได้อย่างไร $ env x='() { :;}; echo vulnerable' bash -c "echo this is a test" vulnerable this is a test แก้ไข 1 : ระบบที่ถูกปะแก้มีลักษณะดังนี้: $ env x='() { :;}; echo vulnerable' bash -c "echo this is a test" bash: warning: x: ignoring …

5
ทำไมสคริปต์ Bash ของฉันไม่รู้จักชื่อแทน
ใน~/.bashrcไฟล์ของฉันอยู่สองคำจำกัดความ: commandAซึ่งเป็นชื่อแทนไปยังเส้นทางที่ยาวกว่า commandBซึ่งเป็นชื่อแทนสคริปต์ Bash ฉันต้องการประมวลผลไฟล์เดียวกันด้วยสองคำสั่งดังนั้นฉันจึงเขียนสคริปต์ Bash ต่อไปนี้: #!/bin/bash for file in "$@" do commandA $file commandB $file done แม้หลังจากออกจากระบบและเข้าสู่ระบบใหม่ Bash จะแจ้งให้ฉันทราบcommand not foundข้อผิดพลาดสำหรับคำสั่งทั้งสองเมื่อฉันเรียกใช้สคริปต์นี้ ผมทำอะไรผิดหรือเปล่า?
216 bash  alias 

4
วิธีกำหนดตัวคั่น 'tab' ด้วย 'cut' ใน BASH
นี่คือตัวอย่างของการใช้cutเพื่อแบ่งอินพุตลงในฟิลด์โดยใช้ตัวคั่นช่องว่างและการรับฟิลด์ที่สอง: cut -f2 -d' ' ตัวคั่นสามารถกำหนดเป็นแท็บแทนที่จะเว้นวรรคได้อย่างไร
215 bash  cut 

3
ผลกระทบด้านความปลอดภัยของการลืมอ้างตัวแปรในเชลล์ bash / POSIX
หากคุณได้ติดตาม unix.stackexchange.com มาระยะหนึ่งแล้วคุณควรจะรู้ว่าตอนนี้การปล่อยตัวแปรที่ไม่ได้ระบุไว้ในบริบทรายการ (ดังในecho $var) ใน Bourne / POSIX shells (zsh เป็นข้อยกเว้น) มีความหมายพิเศษมากและ ไม่ควรทำจนกว่าคุณจะมีเหตุผลที่ดี มันกล่าวถึงในระยะในจำนวนของ Q & A นี่ (ตัวอย่าง: ทำไมไม่เชลล์สคริปต์สำลักของฉันในช่องว่างหรืออักขระพิเศษอื่น ๆ , เมื่อสองครั้ง quoting จำเป็น? , การขยายตัวของตัวแปรเปลือกและผลของ glob และแยกกับมัน , ที่ยกมา vs การขยายสตริงที่ไม่ได้กล่าวถึง) เป็นเช่นนี้มาตั้งแต่การเปิดตัว Bourne shell ในช่วงปลายยุค 70 และไม่ได้ถูกเปลี่ยนแปลงโดย Korn shell (หนึ่งในความเสียใจที่ยิ่งใหญ่ที่สุดของDavid Korn (คำถาม # 7) ) หรือbashที่คัดลอก Korn …

7
วิธีลบบรรทัดเดียวออกจากประวัติ
ฉันทำงานใน Mac OSX ดังนั้นฉันเดาว่าฉันใช้ทุบตี ... ? บางครั้งฉันป้อนบางสิ่งที่ฉันไม่ต้องการให้จดจำในประวัติศาสตร์ ฉันจะลบออกได้อย่างไร

9
วิธีการดูผลลัพธ์ของกระบวนการทำงานในเซสชั่นทุบตีอื่น?
ฉันออกจากสคริปต์ที่ทำงานบนเครื่องระยะไกลจากเมื่อฉันทำงานในท้องถิ่น ฉันสามารถเชื่อมต่อผ่าน SSH psกับเครื่องเป็นผู้ใช้เดียวกันและดูสคริปต์ที่ทำงานอยู่ใน $ ps aux | grep ipcheck myuser 18386 0.0 0.0 18460 3476 pts/0 S+ Dec14 1:11 /bin/bash ./ipchecker.sh มันเป็นเพียงการส่งออกไปยัง stdout ในเซสชั่นท้องถิ่น (ฉันวิ่งใน./ipchecker.shรูปแบบหน้าต่าง terminal ท้องถิ่นไม่มีการเปลี่ยนเส้นทางไม่มีการใช้งานscreenฯลฯ ) มีต่อไปจากเซสชัน SSH ที่ฉันสามารถดูผลลัพธ์ของคำสั่งที่รันอยู่ (โดยไม่หยุด) จนถึงตอนนี้สิ่งที่ดีที่สุดที่ฉันพบคือใช้strace -p 18386แต่ฉันได้รับข้อความจำนวนมากลอยขึ้นมาบนหน้าจอซึ่งมีรายละเอียดมากเกินไป ฉันสามารถหยุดstraceและจากนั้นร่อนผ่านเอาท์พุทและค้นหาข้อความที่นำมาพิมพ์ไปยัง stdout แต่มันยาวและสับสนและเห็นได้ชัดว่าในขณะที่มันหยุดฉันอาจพลาดบางอย่าง ฉันต้องการหาวิธีที่จะเห็นเอาต์พุตสคริปต์ทำงานเสมือนว่าฉันทำงานในพื้นที่ ใครสามารถปรับปรุงสิ่งนี้ได้บ้าง คำตอบที่ชัดเจนคือการรีสตาร์ทสคริปต์ด้วยการเปลี่ยนเส้นทางหรือในscreenเซสชั่น ฯลฯ นี่ไม่ใช่สคริปต์ที่สำคัญต่อภารกิจดังนั้นฉันสามารถทำได้ แต่ฉันเห็นว่านี่เป็นแบบฝึกหัดการเรียนรู้ที่สนุกสนาน

20
วิธีการเพิ่มบรรทัดใหม่ในตอนท้ายของไฟล์?
No newline at end of fileโดยใช้ระบบการควบคุมรุ่นที่ฉันได้รับรำคาญที่เสียงเมื่อต่างกล่าวว่า ดังนั้นฉันสงสัยว่า: วิธีเพิ่มบรรทัดใหม่ที่ท้ายไฟล์เพื่อกำจัดข้อความเหล่านั้นได้อย่างไร

7
คำสั่ง "eval" ใน bash คืออะไร?
คุณสามารถทำอะไรกับevalคำสั่ง? ทำไมถึงมีประโยชน์ มันมีฟังก์ชั่นในตัวในการทุบตี? ไม่มีmanหน้าสำหรับมัน ..
176 bash  shell  eval 

7
เทอร์มินัลพรอมต์ไม่ถูกต้อง
ฉันมีปัญหาเมื่อฉันพิมพ์คำสั่งที่ยาวมากใน bash เทอร์มินัลจะไม่แสดงสิ่งที่ฉันพิมพ์อย่างถูกต้อง ฉันคาดหวังว่าถ้าฉันมีคำสั่งดังต่อไปนี้: username@someserver ~/somepath $ ssh -i /path/to/private/key myusername@something.someserver.com คำสั่งควรแสดงผลสองบรรทัด แต่มันมักจะพันไปรอบ ๆ และเริ่มเขียนที่ส่วนบนของพรอมต์ของฉันค่อนข้างเป็นดังนี้: myreallylongusername@something.somelongserver.comh -i /path/to/private/key หากฉันตัดสินใจย้อนกลับและเปลี่ยนการโต้แย้งบางอย่างไม่มีการบอกตำแหน่งที่เคอร์เซอร์จะปรากฏขึ้นบางครั้งในช่วงกลางของพรอมต์ แต่โดยทั่วไปจะอยู่บนบรรทัดด้านบนที่ฉันพิมพ์ ความสนุกสนานเพิ่มเติมเกิดขึ้นเมื่อฉันUpไปที่คำสั่งก่อนหน้า ฉันได้ลองใช้ทั้ง gnome-terminal และ terminator และใน i3 และ Cinnamon มีคนแนะนำว่านั่นคือพรอมต์ของฉันดังนั้นนี่คือ: \[\033[01;32m\]\u:\[\033[01;34m\] \W\033[01;34m \$\[\033[00m\] Ctrll, resetและclearทุกคนทำในสิ่งที่พวกเขาพูด แต่เมื่อฉันพิมพ์คำสั่งกลับมาหรือUpสิ่งเดียวกันเกิดขึ้น ฉันตรวจสอบและcheckwinsizeเปิดใช้งานในทุบตี สิ่งนี้เกิดขึ้นใน 80x24 และขนาดหน้าต่างอื่น ๆ นี่เป็นเพียงสิ่งที่ฉันเรียนรู้ที่จะอยู่ด้วยหรือไม่? มีชิ้นส่วนของเวทมนตร์ที่ฉันควรรู้หรือไม่? ฉันได้ตัดสินเพียงแค่ใช้พรอมต์สั้น ๆ แต่ก็ไม่สามารถแก้ไขปัญหาได้
171 bash  terminal  prompt 

12
ฉันจะเปลี่ยนนามสกุลของหลายไฟล์ได้อย่างไร
ผมอยากจะเปลี่ยนนามสกุลไฟล์จากไป*.txt *.textฉันพยายามใช้basenameคำสั่ง แต่ฉันมีปัญหาในการเปลี่ยนมากกว่าหนึ่งไฟล์ นี่คือรหัสของฉัน: files=`ls -1 *.txt` for x in $files do mv $x "`basename $files .txt`.text" done ฉันได้รับข้อผิดพลาดนี้: basename: too many arguments Try basename --help' for more information


6
เรียกใช้คำสั่งที่มีเงาโดยนามแฝง
สมมติว่าฉันมีนามแฝงต่อไปนี้ในทุบตี - alias ls='ls --color=auto'- และฉันต้องการโทรธรรมดาlsโดยไม่มีตัวเลือก เป็นวิธีเดียวที่จะทำเช่นนั้นคือ unalias ทำคำสั่งแล้วนามแฝงอีกครั้ง? หรือมีเคล็ดลับหรือวิธีแก้ปัญหาที่ดี?
163 bash  shell  alias 

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