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

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

3
ปิดใช้งานการทำให้แท็บ bash เสร็จสิ้น
เป็นไปได้หรือไม่ที่จะปิดใช้งานการเติมข้อความอัตโนมัติของ bash บนแท็บที่กด? เหตุผลที่ฉันต้องการทำเช่นนี้คือฉันมักจะวางรหัสจากตัวแก้ไขที่ฉันใช้อักขระแท็บแทนการเว้นวรรคจำนวนมากสำหรับการเยื้องลงในเทอร์มินัลของฉัน และไม่คุณไม่สามารถโน้มน้าวให้ฉันใช้ช่องว่างแทนแท็บได้

6
ทำไมทุบตีมาตรฐานบน Linux?
ลีนุกซ์ลีนุกซ์รุ่นล่าสุดส่วนใหญ่มี bash เป็นเชลล์เริ่มต้น, แม้ว่าจะมีเชลล์อื่น, แต่มีเชลล์ที่ดีกว่า ฉันพยายามที่จะเข้าใจว่านี่คือสิ่งที่เหลืออยู่ในประวัติศาสตร์ที่ไม่มีใครต้องการเปลี่ยนแปลงหรือมีเหตุผลที่ดีที่ทำให้การเลือกครั้งแรกเป็นเรื่องไร้สาระหรือไม่
19 linux  bash 

2
.bashrc เขียนทับแล้วแต่ยังมีที่มา - จะกู้คืนได้อย่างไร?
โดยปกติเมื่อฉันพบคำสั่งที่ฉันต้องการนามแฝงฉันจะสะท้อนไปยัง. bashrc ของฉันอย่างนั้น: [up button pressed to last command, then line edited so that it reads] $echo "command-i-just-did" >> ~/.bashrc อาจมีวิธีที่ดีกว่าในการทำเช่นนี้ แต่อย่างไรก็ตามตอนนี้ฉันเขียนทับไฟล์. rc ทั้งหมดโดยใช้เครื่องหมายบั้งเดียว อย่างไรก็ตามเนื่องจาก. bashrc ยังคงเป็นปัจจุบันอยู่ก็ยังคงยอมรับนามแฝงเก่าของฉัน (สำหรับตอนนี้) ดังนั้นมีวิธีการกู้คืนหรือไม่

2
Bash ไม่สามารถใช้งานได้อย่างสมบูรณ์สำหรับผู้ใช้ใหม่
ฉันเพิ่งสร้างผู้ใช้ใหม่บนระบบของฉันโดยใช้useradd -d /home/users/john -m john(ใช้ Ubuntu 11.04) สิ่งนี้ใช้ได้ดี แต่เมื่อฉันเปลี่ยนjohnเป็นทุบตีของฉันก็ใช้งานไม่ได้อย่างสมบูรณ์ นั่นคือมันยังไม่มีการเติมข้อความอัตโนมัติฉันไม่สามารถใช้ปุ่มลูกศรที่พวกเขา (เช่นขึ้นที่จะได้รับคำสั่งสุดท้าย) $และแทนที่จะแสดงไดเรกทอรีปัจจุบันของฉันมันแสดงให้เห็นเท่านั้น ฉันโหลด a .bashrcแต่ดูเหมือนว่าจะถูกละเว้นอย่างสมบูรณ์ อะไรทำให้เกิดสิ่งนี้ PD: ผู้ใช้รายนี้ทำงานบนระบบแล้วและฉันไม่ต้องการลบออกและเพิ่มอีกครั้งหากเป็นไปได้
19 bash  users  useradd 

3
วิธีลบส่วนหนึ่งของเส้นทางในเชลล์แบบโต้ตอบได้อย่างไร
มีทางลัดใน bash และ zsh เพื่อลบองค์ประกอบหนึ่งของเส้นทางหรือไม่? ตัวอย่างเช่นถ้าฉันพิมพ์ls ~/local/color/และเคอร์เซอร์อยู่ที่ท้ายบรรทัดมีทางลัดในการลบcolor/ที่ท้ายหรือไม่ เป็นการดีที่ฉันต้องการโซลูชันทั้งในโหมด vi และโหมด emacs
19 bash  shell  zsh 

2
เหตุใดสคริปต์นี้จึงทำงานในเทอร์มินัล แต่ไม่ใช่จากไฟล์
ฉันได้บันทึกเชลล์สคริปต์ไว้ในไฟล์แล้วมันจะทำการทดแทนสตริงพื้นฐาน #!/bin/sh html_file=$1 echo "html_file = $html_file" substr=.pdf pdf_file="${html_file/.html/.pdf}" echo "pdf_file = $pdf_file" ถ้าฉันวางลงในบรรทัดคำสั่งก็ใช้งานได้: $ html_file="/home/max/for_pauld/test_no_base64.html" echo "html_file = $html_file" substr=.pdf pdf_file="${html_file/.html/.pdf}" echo "pdf_file = $pdf_file" จะช่วยให้ html_file = /home/max/for_pauld/test_no_base64.html pdf_file = /home/max/for_pauld/test_no_base64.pdf นั่นเป็นผลลัพธ์จากเสียงสะท้อนด้านบน - มันทำงานได้ตามที่ตั้งใจไว้ แต่เมื่อฉันเรียกสคริปต์ด้วย $ saucer "/home/max/for_pauld/test_no_base64.html" ฉันได้ผลลัพธ์นี้: html_file = /home/max/for_pauld/test_no_base64.html /home/max/bin/saucer: 5: /home/max/bin/saucer: Bad substitution สคริปต์ของฉันใช้ …
19 bash  string 

2
Bash .hushlogin, ให้เวลาล็อกอินและโฮสต์ล่าสุด
ที่ บริษัท ของฉันเมื่อฉันเข้าสู่เซิร์ฟเวอร์บางแห่งการเข้าสู่ระบบครั้งล่าสุดของฉันและแบนเนอร์ขนาดใหญ่จะปรากฏขึ้น: me@my-laptop$ ssh the-server Last login: Mon Feb 8 18:54:36 2016 from my-laptop.company.com ************************************************************************ * * * C O M P A N Y I N F O R M A T I O N S Y S T E M S * * * * !WARNING! Your …
19 bash  login  motd 

4
มันเป็นวิธีที่มีเหตุผลในการ“ สำรองข้อมูล” ตัวแปร $ IFS หรือไม่
ฉันลังเลที่จะยุ่งกับ$IFSมันอยู่เสมอเพราะมันเป็นสิ่งที่ขัดขวางโลก แต่บ่อยครั้งมันทำให้การโหลดสตริงลงในอาเรย์ของ bash นั้นดีและกระชับและสำหรับสคริปของ bash นั้นความรัดกุมยากที่จะเกิดขึ้น ดังนั้นฉันคิดว่ามันอาจจะดีกว่าไม่มีอะไรถ้าฉันพยายามที่จะ "บันทึก" เนื้อหาเริ่มต้นของ$IFSตัวแปรอื่นแล้วคืนค่าทันทีหลังจากที่ฉันใช้$IFSบางสิ่งบางอย่าง เป็นจริงหรือไม่? หรือว่ามันไร้ประโยชน์อย่างยิ่งและฉันควรตั้งค่าIFSกลับไปที่สิ่งที่จำเป็นสำหรับการใช้งานในภายหลังโดยตรง

4
bash: วิธีการเผยแพร่ข้อผิดพลาดในการทดแทนกระบวนการ?
ฉันต้องการเชลล์สคริปต์ของฉันล้มเหลวเมื่อใดก็ตามที่คำสั่งดำเนินการกับพวกเขาล้มเหลว โดยทั่วไปแล้วฉันจะทำกับ: set -e set -o pipefail (ฉันมักจะเพิ่มset -uด้วย) สิ่งนี้คือไม่มีสิ่งใดในข้างต้นที่ใช้ได้กับการทดแทนกระบวนการ รหัสนี้พิมพ์ว่า "ok" และออกโดยมีรหัสส่งคืน = 0 ในขณะที่ฉันต้องการมันล้มเหลว: #!/bin/bash -e set -o pipefail cat <(false) <(echo ok) มีอะไรที่เทียบเท่ากับ "pipefail" แต่สำหรับการทดแทนกระบวนการ? วิธีอื่นใดในการส่งผ่านคำสั่งเอาต์พุตของคำสั่งเหมือนกับเป็นไฟล์ แต่การเพิ่มข้อผิดพลาดเมื่อใดก็ตามที่โปรแกรมเหล่านั้นล้มเหลว? วิธีแก้ไขปัญหาของคนจนจะตรวจพบว่าคำสั่งเหล่านั้นเขียนไปยัง stderr (แต่บางคำสั่งเขียนไปยัง stderr ในสถานการณ์ที่ประสบความสำเร็จ) อีกโซลูชันที่สอดคล้องกับ posix จะใช้ชื่อ pipes แต่ฉันจำเป็นต้อง lauch คำสั่งเหล่านั้น - ใช้ - กระบวนการแทน - เป็น oneliners สร้างขึ้นทันทีจากรหัสรวบรวมและสร้างไปป์ชื่อจะซับซ้อนสิ่ง …

8
การเรียกใช้สคริปต์ทุบตีหลาย ๆ ชุดและเรียกใช้พร้อมกันไม่ใช่เรียงตามลำดับ
สมมติว่าฉันมีสาม (หรือมากกว่า) สคริปต์ทุบตี: script1.sh, และscript2.sh script3.shผมอยากจะเรียกทั้งสามของสคริปต์เหล่านี้และเรียกพวกเขาในแบบคู่ขนาน วิธีหนึ่งในการทำเช่นนี้คือเพียงเรียกใช้คำสั่งต่อไปนี้ nohup bash script1.sh & nohup bash script2.sh & nohup bash script3.sh & (โดยทั่วไปสคริปต์อาจใช้เวลาหลายชั่วโมงหรือหลายวันจึงจะเสร็จสิ้นดังนั้นฉันต้องการใช้nohupเพื่อให้สคริปต์ทำงานต่อไปแม้ว่าคอนโซลของฉันจะปิด) แต่มีวิธีใดบ้างที่จะดำเนินการคำสั่งทั้งสามนี้ควบคู่กับการโทรครั้งเดียว ? ฉันกำลังคิดอะไรบางอย่างเช่น nohup bash script{1..3}.sh & แต่นี้จะปรากฏในการดำเนินการscript1.sh, script2.shและscript3.shในลำดับที่ไม่ได้อยู่ในแบบคู่ขนาน

3
มีวิธีที่จะทำให้รูปภาพ. pdf เรียบจากบรรทัดคำสั่งหรือไม่
ใน GIMP ฉันสามารถนำเข้า. pdf และใช้ GUI เพื่อทำให้แบน (ถ้าทำด้วยเลเยอร์จำนวนมาก) โดยเลือก "Flatten Image" ในเมนูแบบเลื่อนลง "รูปภาพ" จากนั้นฉันสามารถส่งออก. pdf ด้วยชื่อไฟล์ใหม่ ฉันต้องการทำสิ่งนี้โดยอัตโนมัติ มีวิธีทำผ่านเทอร์มินัลไหม?

6
ฉันจะพิมพ์เฉพาะคำสั่งบางอย่างจากสคริปต์ทุบตีขณะที่ทำงานได้อย่างไร
ฉันมีสคริปต์ทุบตีด้วยถ้าคำสั่งต่างๆตามอาร์กิวเมนต์บรรทัดคำสั่งที่ฉันผ่านเมื่อเรียกมัน การมีเอาต์พุตบางอย่างเกี่ยวกับคำสั่งที่กำลังรันอยู่มีประโยชน์ในการยืนยันการไหลของข้อมูลทั้งหมดหากข้อความสั่ง แต่โซลูชันปัจจุบันของฉันให้ข้อมูลมากเกินไป การใช้set -vในสคริปต์ค่อนข้างมีประโยชน์ในการดูคำสั่งที่พิมพ์บนหน้าจอขณะที่รันในสคริปต์ แต่ฉันได้รับคำสั่งมากเกินไป มันเกือบจะเหมือนสำเนาทั้งหมดของสคริปต์ ฉันต้องการเอาต์พุตที่แสดงว่าคำสั่งใดกำลังทำงานอยู่ แต่ฉันไม่ต้องการเห็นข้อคิดเห็นบรรทัดใหม่นิพจน์ใน if statement ฯลฯ มีวิธีที่ฉันสามารถส่งออกเป็นไปได้ทั้งหมดที่สร้างขึ้นโดยตัวเลือก -v ผ่าน regex ก่อนที่จะถูกพิมพ์? หรือวิธีอื่น ๆ ในการรับ bash ไปยังคำสั่งเอาต์พุตของ "type" บางอย่างเท่านั้น (เช่นที่กำลังใช้ executables และไม่เพียงแค่ bash statement เฉพาะข้อคิดเห็น ฯลฯ หรือไม่) [1] /programming/257616/sudo-changes-path-whyมีประโยชน์มากในเรื่องนี้และเป็นที่ที่ฉันได้รับคำแนะนำสำหรับการset -vใช้งาน แก้ไข : สคริปต์ที่คล้ายกัน (แต่ไม่เหมือนกัน) กับสคริปต์ที่ฉันใช้: #!/bin/bash #get verbose command output set -v env=$1 if [ …

3
echo vs <<< หรือใช้ echo ใน Bash Award อย่างไร้ประโยชน์?
โดยตอนนี้ใช้ประโยชน์ของcatรางวัลเป็นที่รู้จักกันเป็นอย่างดีและยังมีการเอ่ยถึงการใช้ประโยชน์ของecho (ไม่เกี่ยวข้องกับคำถามนี้) ฉันสงสัยว่าควรจะมี "การใช้งานไร้ประโยชน์echoในรางวัล Bash": การวางท่อดูเหมือนจะช้ากว่า heredocs และ herestrings มากตามการวัดทางวิทยาศาสตร์บางอย่าง: Heredocs: for reps in 1 2 3 do time for i in {1..1000} do cat &lt;&lt;'END' test string END done &gt; /dev/null done real 0m1.786s user 0m0.212s sys 0m0.332s real 0m1.817s user 0m0.232s sys 0m0.332s real 0m1.846s user 0m0.256s sys …

5
ฉันจะตรวจจับได้อย่างไรว่าไม่มีตัวเลือกใดถูกส่งผ่านด้วย getopts
ฉันมีรหัสนี้ - #getoptDemo.sh usage() { echo "usage: &lt;command&gt; options:&lt;w|l|h&gt;" } while getopts wlh: option do case $option in (w) name='1';; (l) name='2';; (h) name='3';; (*) usage exit;; esac done print 'hi'$name เมื่อผมทำงานbash getoptDemos.sh(ไม่มีตัวเลือก) จะพิมพ์แทนการเรียกฟังก์ชั่นhi usageมันเรียกการใช้งานเมื่อตัวเลือกอื่นนอกเหนือจาก w, h และ l จะได้รับ จากนั้นไม่สามารถใช้งานได้เมื่อไม่มีการระบุตัวเลือก ผมได้ลองใช้?, \?, :ในสถานที่ของ*แต่ฉันไม่สามารถบรรลุสิ่งที่ผมอยากจะ ผมหมายถึงทั้งหมดที่docsเกี่ยวกับการบอกว่ามันกับการใช้งานgetopt? ผมทำอะไรผิดหรือเปล่า?
19 bash  shell  options  getopts 

2
การดำเนินการคำสั่ง if จากพรอมต์คำสั่ง
ในทุบตีฉันสามารถทำต่อไปนี้: if [ -f /tmp/test.txt ]; then echo "true"; fi อย่างไรก็ตามหากฉันเพิ่มsudoไว้ด้านหน้ามันจะไม่ทำงานอีกต่อไป: sudo if [ -f /tmp/test.txt ]; then echo "true"; fi -bash: syntax error near unexpected token `then' ฉันจะทำให้มันทำงานได้อย่างไร

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