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

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

4
ln -s พร้อมกับพา ธ ที่สัมพันธ์กับ pwd
ฉันพยายามสร้างลิงก์สัญลักษณ์มากมาย แต่ฉันไม่สามารถเข้าใจได้ว่าทำไมสิ่งนี้ถึงใช้งานได้ ln -s /Users/niels/something/foo ~/bin/foo_link ในขณะนี้ cd /Users/niels/something ln -s foo ~/bin/foo_link ไม่ใช่. ฉันเชื่อว่ามีบางอย่างเกี่ยวข้องกับการfoo_linkเชื่อมโยงไปยัง foo /Users/niels/binแทน/Users/niels/something ดังนั้นคำถามคือฉันจะสร้างลิงก์สัญลักษณ์ที่ชี้ไปยังเส้นทางที่แน่นอนได้โดยไม่ต้องพิมพ์ได้อย่างไร สำหรับการอ้างอิงฉันใช้ Mac OS X 10.9 และ Zsh
26 bash  shell  symlink  ln 

7
ควรสคริปต์ที่ต้องใช้ sudo ล้มเหลวหากไม่มีหรือใช้ sudo และพรอมต์?
ฉันมีสคริปต์ที่ให้การควบคุมความสว่างแบ็คไลท์ของฉันอย่างละเอียดและต้องsudoดำเนินการ เป็นหลักนี้: backlight="/sys/class/backlight/acpi_video0/brightness" echo $1 | tee $backlight ~/bin/backlight-adjustและชีวิตที่ สคริปต์ต้องการsudoสิทธิ์เนื่องจากtee $backlightกำลังเขียนไปยังตำแหน่งที่มีสิทธิ์ sudoดังนั้นมันจะล้มเหลวถ้ามันไม่ได้ทำงานด้วย วิธีการนี้มีปัญหาเพราะฉันไม่สามารถวิ่งsudo backlight-adjustได้เพราะ~/binไม่ได้อยู่$PATHในsudoสภาพแวดล้อม แต่ในสภาพแวดล้อมของฉันเท่านั้น ดังนั้นฉันต้องวิ่งsudo env "PATH=$PATH" backlight-adjustหรืออะไรทำนองนั้น หรือฉันอาจจะเขียนมันแบบนี้ backlight="/sys/class/backlight/acpi_video0/brightness" echo $1 | sudo tee $backlight และแจ้งรหัสผ่านให้ฉัน วิธีที่สองใช้งานได้ดีกว่าสำหรับฉันเพราะฉันไม่ต้องจำให้พิมพ์ sudo; มันจะทำให้ฉัน และฉันสามารถรักษา$PATHเหมือนเดิม โดยรวมแล้วรู้สึกสะดวกกว่า แต่มีเหตุผลใดที่ฉันไม่ควรทำอย่างที่สอง? (ฉันใช้ Xubuntu 14.04 และเชลล์ของฉันคือ GNU ทุบตี 4.2.45 ถ้านั่นสร้างความแตกต่าง)


2
Bash ไม่พบโปรแกรมแม้ว่าจะอยู่ในเส้นทางของฉัน
ฉันมีโปรแกรมบนเส้นทางของฉัน โปรแกรมรันเมื่อเรียกใช้งานโดยระบุพา ธ แบบเต็ม แต่ไม่พบโปรแกรมเมื่อฉันรันด้วยชื่อของมัน โดยพื้นฐานแล้วฉันต้องการเข้าใจว่าผลลัพธ์ด้านล่างเป็นไปได้อย่างไรและจะแก้ไขอย่างไรเพื่อให้โปรแกรมของฉันสามารถพบได้โดยไม่ต้องระบุเส้นทางแบบเต็ม: root:/usr/local/bin# ./siege **************************************************** siege: could not open /usr/local/bin/etc/siegerc run 'siege.config' to generate a new .siegerc file **************************************************** root:/usr/local/bin# echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games root:/usr/local/bin# siege bash: /usr/bin/siege: No such file or directory root:/usr/local/bin# wtf!?!? ฉันใช้ Ubuntu 12.04 โดยใช้ bash นอกจากนี้โปรดทราบว่าผลลัพธ์ของคำเตือนจากการล้อมนั้นไม่เกี่ยวข้องกับวัตถุประสงค์ของคำถามนี้เพราะฉันสนใจเพียงแค่ว่าจะสามารถค้นหาและเรียกใช้โปรแกรมได้หรือไม่
26 bash  path 

5
ทำไมการวนซ้ำไฟล์เร็วกว่าการอ่านลงในหน่วยความจำและการคำนวณสองครั้งทำไม
ฉันกำลังเปรียบเทียบสิ่งต่อไปนี้ tail -n 1000000 stdout.log | grep -c '"success": true' tail -n 1000000 stdout.log | grep -c '"success": false' ด้วยดังต่อไปนี้ log=$(tail -n 1000000 stdout.log) echo "$log" | grep -c '"success": true' echo "$log" | grep -c '"success": false' และน่าประหลาดใจที่สองใช้เวลานานกว่าครั้งแรกเกือบ 3 เท่า มันควรจะเร็วกว่านี้ใช่ไหม
26 bash  performance  io 

4
วิธีการแก้ปัญหาและแก้ไขการเติมข้อความอัตโนมัติช้าในทุบตี?
หลังจากอัปเดตล่าสุด (Ubuntu 12.04 LTS) TAB เสร็จสมบูรณ์ในบรรทัดคำสั่งช้า หลังจากป้อนคำสั่งบางส่วน (เช่นevi [TAB]) หรือชื่อไฟล์บางส่วน (เช่นevince somedocu[TAB]) เชลล์บางครั้งอาจไม่เสมอไปแขวนเป็นเวลาหลายวินาที โดยส่วนตัวแล้วฉันต้องการให้การเติมข้อความอัตโนมัติที่มีประสิทธิภาพน้อยลงไปยังเครื่องที่ช้า มีวิธีแก้ไขง่ายๆหรือไม่? แก้ไข:ข้อมูลเพิ่มเติมที่เกี่ยวข้องกับความคิดเห็น: PATH นั้นค่อนข้างมาตรฐาน ~ / bin มีสคริปต์ทุบตีบางส่วน $ echo $PATH /home/USERNAME/bin:/usr/local/bin:/usr/bin:/bin:/usr/games จำนวนไฟล์ในไดเรกทอรีการทำงานน้อยกว่า 100 คุณลักษณะการเติมข้อความอัตโนมัติช้าลงอย่างมากหลังจากการทำงานของดิสก์ผิดปกติ (อัพเกรดระบบ) ดังนั้นจึงเป็นไปได้ว่าการอ่านซ้ำ / usr / bin และไดเรกทอรีอื่น ๆ ทำให้เกิดความล่าช้า

1
ดำเนินการฟังก์ชั่น readline โดยไม่ต้องผูกปุ่ม?
ฉันแค่อ่าน readline man-page และค้นพบคำสั่งมากมายที่ฉันไม่รู้ อย่างไรก็ตามหลายคนไม่มีการเชื่อมโยงคีย์เริ่มต้น มีวิธีรันคำสั่ง unbound จากเชลล์หรือไม่? ฉันไม่ได้ถามว่าจะผูกคำสั่งใน ~ / .inputrc ได้อย่างไร แต่จะรันมันเป็น "one off" จาก shell หรือใน bash script ได้ ตัวอย่างเช่นคำสั่ง "dump-variables" มีคำสั่งที่ฉันสามารถฟีด "ตัวแปรตัวแปร" เพื่อเป็นอาร์กิวเมนต์เพื่อให้ได้ดำเนินการ?
26 bash  shell  readline  inputrc 

5
พิมพ์เอาต์พุตไปยัง 3 คอลัมน์แยกกัน
MYPATH=/var/www/html/error_logs/ TOTALFILE=$(ls $MYPATH* | wc -l) FILETIME=$(stat --format=%y $MYPATH* | head -5 | cut -d'.' -f1) FILE=$(ls -1tcr $MYPATH* | head -5 | rev | cut -d/ -f1 | rev) TOPLINE=$(head -1 $MYPATH* | grep -Po '".*?"' | head -5) ฉันจะพิมพ์ข้อมูล 5 ไฟล์นี้ลงในคอลัมน์ด้วยส่วนหัวได้อย่างไร? FILE CREATED TIME | FILE NAME | …

4
คุณจะป้อนไดเรกทอรีที่ชื่อเป็นลบได้อย่างไร
ฉันดาวน์โหลดlessnไปยังเว็บเซิร์ฟเวอร์ของฉันและคลายซิปแล้ว -มันมีโฟลเดอร์ชื่อ ฉันคิดว่าฉันรู้วิธีจัดการกับสิ่งนั้น แต่ฉันไม่ทำ ฉันพยายามcd -- -แล้ว แต่นั่นก็ไม่ได้มีผลที่ต้องการ ดูเหมือนว่าการใช้เครื่องหมายคำพูดจะไม่ส่งผลกระทบใด ๆ ฉันใส่สแลชทั่วสถานที่ไม่มีประโยชน์ วิธีที่เหมาะสมในการเปลี่ยนเป็นโฟลเดอร์นี้คืออะไร?
26 bash  cd-command 

2
เหตุใดจึงไม่สามารถเรียกใช้งานรูทได้เมื่อตั้งค่าบิตที่สามารถเรียกทำงานได้
rootผู้ใช้สามารถเขียนไปยังไฟล์แม้ว่าwriteจะไม่ได้ตั้งค่าการอนุญาต rootผู้ใช้สามารถอ่านไฟล์ได้แม้ว่าreadจะไม่ได้ตั้งค่าการอนุญาต rootผู้ใช้สามารถ cdเข้าไปในไดเรกทอรีแม้ว่าexecuteจะไม่ได้ตั้งค่าการอนุญาต rootผู้ใช้ไม่สามารถเรียกใช้ไฟล์เมื่อexecuteไม่ได้ตั้งค่าการอนุญาต ทำไม? user$ echo '#!'$(which bash) > file user$ chmod 000 file user$ ls -l file ---------- 1 user user 12 Jul 17 11:11 file user$ cat file # Normal user cannot read cat: file: Permission denied user$ su root$ echo 'echo hello' >> file # …


7
สลับตัวแปรบูลีน
ฉันต้องการลองใช้สคริปต์อย่างง่าย flag=false while !$flag do read x if [ "$x" -eq "true" ] then flag=true fi echo "${x} : ${flag}" done แต่เมื่อฉันเรียกใช้ถ้าฉันพิมพ์trueฉันจะเห็นว่าx="true"และflag="true"แต่รอบไม่สิ้นสุด เกิดอะไรขึ้นกับสคริปต์ ฉันจะสลับตัวแปรบูลีนอย่างถูกต้องได้อย่างไร
26 bash  scripting 


8
ใช้ไฟล์ config สำหรับเชลล์สคริปต์ของฉัน
ฉันต้องการสร้างไฟล์ปรับแต่งสำหรับสคริปต์ของตัวเอง: นี่เป็นตัวอย่าง: สคริปต์: #!/bin/bash source /home/myuser/test/config echo "Name=$nam" >&2 echo "Surname=$sur" >&2 เนื้อหาของ/home/myuser/test/config: nam="Mark" sur="Brown" นั่นเป็นผลงาน! คำถามของฉัน: นี่เป็นวิธีที่ถูกต้องในการทำเช่นนี้หรือมีวิธีอื่นหรือไม่?

2
ใน bash script วิธีจับ stdout ทีละบรรทัด
ในสคริปต์ทุบตีฉันต้องการจับเอาท์พุทมาตรฐานของบรรทัดคำสั่งแบบยาวต่อบรรทัดเพื่อให้สามารถวิเคราะห์และรายงานได้ในขณะที่คำสั่งเริ่มต้นยังคงทำงานอยู่ นี่เป็นวิธีที่ซับซ้อนที่ฉันสามารถจินตนาการได้: # Start long command in a separated process and redirect stdout to temp file longcommand > /tmp/tmp$$.out & #loop until process completes ps cax | grep longcommand > /dev/null while [ $? -eq 0 ] do #capture the last lines in temp file and determine if there is …
26 bash  process  stdout 

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