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

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

1
สองท่อต่อหนึ่งคำสั่ง
ฉันสับสนเล็กน้อยตามไวยากรณ์ต่อไปนี้ แม้ว่ามันจะใช้งานได้ แต่ก็ไม่เข้าใจว่าทำไมมันถึงได้ผล ดูเหมือนว่ามีสองท่อที่ต่ออยู่กับคำสั่ง diff แต่ไม่มีเพียงอันเดียวSTDINใช่ไหม ตัวอย่าง: diff <(echo "foobar") <(echo "barbaz") diff <(cat foo.txt) <(cat bar.txt)
9 bash  shell 

4
การเติมข้อความอัตโนมัติที่ไม่ถูกต้อง
ฉันกำลังเรียกใช้ Debian Wheezy 64 บิต ฉันมีปัญหากับการเติมข้อมูลอัตโนมัติให้ได้ ฉันติดตั้ง bash-เสร็จแล้ว หากฉันเข้าสู่ระบบในฐานะรูทในเชลล์ฉันสามารถใช้การเติมอัตโนมัติสำหรับ apt-get (เช่นapt-get install wicd [tab] [tab ]) และมันจะแสดงแพ็คเกจทั้งหมดที่ตรงกับที่ฉันทำ แต่ถ้าฉันพยายามที่จะใช้การทำให้สมบูรณ์อัตโนมัติสำหรับ apt-get ในผู้ใช้ที่ไม่ใช่รูทคนอื่น (แม้กระทั่ง sudo) มันจะไม่ทำงานเลย ฉันสามารถเติมสิ่งอื่น ๆ โดยอัตโนมัติเช่นชื่อไฟล์ ความช่วยเหลือใด ๆ ฉันมีรหัสต่อไปนี้ใน. bashrc และ / etc / profile if [ -f /etc/bash_completion ]; then . /etc/bash_completion fi

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


1
หน้าจอตัดการเริ่มต้นของคำสั่งแบบยาวเมื่อเข้าถึงผ่านประวัติทุบตี
ฉันใช้ทุบตีและหน้าจอเริ่มต้นใน OS X Lion เมื่อฉันอยู่ในเซสชั่นหน้าจอและฉันเลื่อนกลับไปที่ประวัติทุบตีและฉันมาถึงคำสั่งที่ยาวพอที่จะห่อ ฉันอาจพิมพ์คำสั่งแรก: selassid@tem02:~$ ls ljmix/fiftyfifty_softsphere/T0.350/r2.43/0.565421311859c0.1 83279836214c0.144847759343/ ที่ห่ออย่างถูกต้องตามที่เขียนไว้ข้างต้น แต่ถ้าฉันกดขึ้นเพื่อเข้าถึงผ่านประวัติของทุบตีคอนโซลจะแสดงเฉพาะ: 83279836214c0.144847759343/ ดังนั้นพรอมต์และบรรทัดแรกของคำสั่งจึงหายไปซึ่งทำให้ยากต่อการแก้ไข หากฉันเลื่อนกลับไปที่บรรทัดแรกมันจะปรากฏขึ้น แต่จะเขียนทับบรรทัดสุดท้ายของเอาต์พุต เมื่อฉันรันคำสั่งส่วนที่เหลือของบรรทัดแรกจะปรากฏขึ้นและทุกอย่างดูเป็นไปตามที่คาดไว้: selassid@tem02:~$ ls ljmix/fiftyfifty_softsphere/T0.350/r2.43/0.565421311859c0.1 83279836214c0.144847759343/ total 1792 ... selassid@tem02:~$ มีอะไรอยากรู้มากกว่านี้คือถ้าใช้ประวัติเพื่อเข้าถึงคำสั่งแบบยาว แต่ฉันยังไม่ได้รันมันให้ใช้C-aคำสั่งหน้าจอใด ๆเช่นสลับไปที่หน้าต่างอื่นแล้วย้อนกลับหรือถ้าฉันคลิกหน้าต่างเทอร์มินัลปัจจุบันของฉัน กลับเข้ามามันคำสั่งประวัติศาสตร์จะปรากฏขึ้นอย่างถูกต้องอีกครั้ง ของฉันPS1='\u@\h:\w$ 'ดังนั้นจึงไม่มีอะไรแปลกเกิดขึ้นที่นั่น มีวิธีแสดงคำสั่งทั้งหมดอย่างถูกต้องเมื่อใช้ประวัติหรือไม่ ฉันได้ลองเล่นโดยใช้การตั้งค่าการห่อหน้าจอ แต่มันก็ทำให้สิ่งต่าง ๆ แย่ลงเท่านั้น stty -a แสดงให้เห็นว่า: speed 9600 baud; 46 rows; 80 columns; lflags: icanon isig iexten …
9 bash  osx  gnu-screen 

2
การขนานสำหรับลูป
ฉันต้องการขนานforลูปของรหัสต่อไปนี้ ทำอย่างไร #!/bin/bash N=$1 n=$2 for (( i=1; i<=$N; i++ )); do min=100000000000000 //set min to some garbage value for (( j=1; j<=$n; j++ )); do val=$(/path/to/a.out) val2=`echo $val | bc` if (( $val2 < $min )); then min=$val2; fi done arr=("${arr[@]}" "$min") done

1
วิธีหยุด Bash ต่อท้ายประวัติ
ฉันมีปัญหามากมายในการตั้งค่าประวัติเทอร์มินัลของ Bash ในแบบที่ฉันต้องการ ฉันต้องการที่จะไม่มีรายการที่ซ้ำกันและถ้าฉันป้อนคำสั่งที่ฉันต้องการมันบันทึกและรายการที่ซ้ำกันข้างต้นถูกลบออก ปัญหาคือhistoryคำสั่งแสดงให้ฉันเห็นว่ามันทำงานได้อย่างที่ฉันต้องการ แต่เมื่อฉันออกจากระบบรายการที่ซ้ำกันจะกลับมาอีกครั้ง ฉันเชื่อว่ามันเป็นเพียงการต่อท้ายประวัติศาสตร์กับสิ่งที่มีอยู่ ฉันมีบรรทัดเหล่านี้ใน.bashrcไฟล์ของฉัน: HISTCONTROL=ignoreboth:erasedups shopt -u histappend ฉันได้ลองแม้shoptไม่แสดงความคิดเห็น แต่ก็ยังผนวกประวัติในการออกจากระบบ ฉันจะมีประวัติว่าเป็นอย่างไรก่อนที่จะออกจากระบบ?

2
พฤติกรรมการควบคุม -d แปลก
ฉันสามารถใช้เป็นโปรแกรมแก้ไขข้อความที่ง่ายมากโดยการทำcat ถ้าฉันพิมพ์แล้ว:cat > foo.txt bar baz จากนั้นกดctrl+ Dตอนนี้จะมีลักษณะดังนี้: $ cat > foo.txt bar baz^D ^ด้วยเคอร์เซอร์ที่ที่ ถ้าฉันกดอีกครั้งไฟล์จะได้รับการบันทึก อย่างไรก็ตามถ้าฉันกดปุ่มอะไรก็ได้ (โอเคอาจจะไม่ใช่ทุกอย่าง แต่ส่วนใหญ่จะเป็นอะไรก็ได้) อื่นฉันก็แค่แก้ไขไฟล์ต่อไป นี่เป็นพฤติกรรมปกติหรือไม่

2
เปิด emacs ในเทอร์มินัลเมื่อแก้ไข crontab
ฉันมีการติดตั้งเป็นบรรณาธิการเริ่มต้นของฉันในemacs /etc/profileเมื่อฉันต้องการที่จะใช้emacsในสถานี ฉันเปิดมันด้วย-nwตัวเลือก ฉันจะมีพฤติกรรมแบบเดียวกันได้อย่างไรเมื่อทำการcrontab -eป้องกันเพื่อเปิดในหน้าต่าง
9 bash  cron  emacs 

1
ฉันได้ตั้ง bash PATH ไว้ที่ไหน?
ฉันต้องการลบออก~/binจากเส้นทางของฉัน ฉันตั้งค่าเมื่อหลายเดือนก่อนเมื่อ Linux (Ubuntu) ใหม่สำหรับฉัน แต่ฉันไม่รู้ว่าฉันจะเพิ่มมันได้อย่างไร ... ไม่มีสิ่งใดปรากฏขึ้นเมื่อฉันค้นหาไฟล์ทั้งหมดตามรายการด้านล่าง จะมีการตั้งค่าที่อื่นอีกไหม มันจะถูก pre-pended หลังจาก$HOME/.profileคำนำหน้าเส้นทางด้วย$HOME/bin ถ้ามันสร้างความแตกต่างฉันจะได้ PATH เหมือนกันจากทั้ง command-prompt และ script ที่กำลังรันอยู่ #!/bin/bash { echo "first dir of PATH is: '${PATH%%:*}'" shopt -s nullglob cat \ /etc/profile \ /etc/bash.bashrc \ /etc/profile.d/*.sh \ $HOME/.bashrc \ $HOME/.bash_aliases \ /etc/bash_completion \ $HOME/.bash_completion* \ $HOME/.profile \ $HOME/.profile_zap …

1
วิธีที่ดีที่สุดในการตรวจจับ (จากสคริปต์) ว่าติดตั้งซอฟต์แวร์คืออะไร?
ฉันเคยผิดหวังมาก่อนด้วยความแตกต่างของเอาต์พุตจากwhichคำสั่งข้ามแพลตฟอร์มที่แตกต่างกัน (Linux กับ Solaris vx. OS X) ด้วยกระสุนที่แตกต่างกันอาจจะเล่นในเรื่องนี้เช่นกัน typeได้รับการแนะนำว่าเป็นทางเลือกที่ดีกว่า แต่มันจะเป็นแบบพกพาได้อย่างไร ในอดีตฉันได้เขียนฟังก์ชั่นซึ่งแยกวิเคราะห์ผลลัพธ์whichและจัดการกรณีการใช้งานที่แตกต่างกันที่ฉันพบ พวกเขาทำงานในเครื่องที่ฉันใช้และก็โอเคสำหรับสคริปต์ส่วนตัวของฉัน แต่ดูเหมือนว่าไม่น่าเชื่อถืออย่างยิ่งสำหรับซอฟต์แวร์ที่ฉันจะโพสต์ที่อื่นเพื่อให้ผู้อื่นใช้ ในการใช้ตัวอย่างที่เป็นไปได้เพียงอย่างเดียวสมมติว่าฉันต้องตรวจจับจากสคริปต์ว่า bash และ zsh มีอยู่ในเครื่องหรือไม่จากนั้นเรียกใช้คำสั่งด้วย zsh หากมีอยู่และทุบตีถ้า zsh ไม่ได้และ bash นั้นเพียงพอ เวอร์ชันที่ไม่มีข้อผิดพลาดเฉพาะ ส่วนที่เหลือของสคริปต์อาจเป็น Bourne shell หรือ Ruby หรืออย่างอื่น แต่สิ่งนี้สิ่งหนึ่งที่ต้องทำ (AFAIK) ด้วย zsh หรือ bash เวอร์ชันล่าสุด ฉันสามารถนับtypeได้ว่ามีอยู่ในแพลตฟอร์มหรือไม่ มีทางเลือกอื่นwhichที่สามารถตอบคำถามได้อย่างง่ายดายและต่อเนื่องว่ามีการติดตั้งซอฟต์แวร์บางส่วนหรือไม่? (ถ้าคุณต้องการให้ความคิดที่เกี่ยวข้องกับตัวอย่างที่ฉันให้มาโดยเฉพาะนั้นยอดเยี่ยม แต่ฉันแค่ถามถึงกรณีทั่วไป: วิธีที่น่าเชื่อถือที่สุดในการตรวจสอบว่ามีการติดตั้งสิ่งใดในเครื่องที่กำหนดหรือไม่ ?)
9 bash  zsh  standard  which 

1
วิธีที่มีประสิทธิภาพมากที่สุดในการรัน 2 ในขณะที่ลูป
ขณะนี้ฉันใช้whileลูปสองแบบที่แตกต่างกันเพื่อเริ่มตัวจัดการหน้าต่างdwmและแถบสถานะที่พิมพ์ข้อมูลระบบลงไป โซลูชันของฉันในขณะนี้คือเรียกใช้พวกเขาอย่างต่อเนื่องในสคริปต์เดียวกันเช่น: while true; do $HOME/Scripts/dwm-status sleep 2s done & while true; do dwm >/dev/null done ฉันเคยเห็นมันทำงานเป็นwhileวนซ้ำเช่นนี้: while true; do while true; do $HOME/Scripts/dwm-status sleep 2s done & dwm >/dev/null done ประการที่สองดูเหมือนว่าจะทำให้เกิด CPU แหลม ในแง่ของประสิทธิภาพ (เรียกใช้ทรัพยากรอย่างน้อยที่สุดเป็นต้น) วิธีที่ดีที่สุดในการใช้งานลูปทั้งสองนี้คืออะไรและเพราะเหตุใด

2
ลำดับความสำคัญของการเปลี่ยนเส้นทาง stdin และ stdout ใน Bash
คำถามของฉันเกี่ยวกับการเปลี่ยนเส้นทางที่สำคัญคือทุบตี สมมติว่าคุณมีคำสั่ง: cmd1 < cmd2 > cmd3 มันจะแปลเป็น: (cmd1 < cmd2) > cmd3 หรือ cmd1 < (cmd2 > cmd3)

1
การแก้ไขเครื่องหมายดอลลาร์ในเครื่องหมายคำพูดในทุบตี
ฉันใช้งานสคริปต์ทดสอบเล็ก ๆ นี้ที่ฉันเขียน: #!/bin/bash TESTCASE=$@ testHarness <<runTest $TESTCASE runTest จากบรรทัดคำสั่ง: ./test.sh "1092$212" แต่เครื่องหมายดอลลาร์กำลังถูกถอดออก ถ้าฉันหลบหนีมันใช้งานได้ แต่ฉันคิดว่าเครื่องหมายคำพูดคู่จะป้องกันฉันจากการต้องทำสิ่งนี้ ใครช่วยได้โปรดช่วยฉันเข้าใจว่าเกิดอะไรขึ้นและจะแก้ไขได้อย่างไร
9 bash  shell  quoting 

6
เปรียบเทียบไฟล์ที่อยู่ในไดเรกทอรี 1 แต่ไม่ใช่ไดเรกทอรี 2 หรือไม่
ฉันมีปัญหากับสคริปต์ทุบตีที่ฉันต้องการ ฉันรู้ว่า ls จะแสดงรายการไฟล์ที่อยู่ในไดเรกทอรี แต่ฉันต้องการให้แสดงรายการไดเรกทอรีที่อยู่ใน directory1 แต่ไม่อยู่ใน directory2 แล้วจึงแสดงรายการไฟล์ใน directory2 ที่ไม่ได้อยู่ใน directory1 ในความพยายามที่อ่อนแอฉันพยายาม: ls -al | diff directory1 directory2 ฉันรู้ได้อย่างรวดเร็วว่าทำไมมันไม่ทำงาน ใครสามารถช่วยทุบตีคนบ้าคลั่งทั้งหมดได้หรือไม่?
9 bash  shell-script  ls  diff 

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