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

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

2
การเรียกลิงก์สัญลักษณ์ซ้ำ - อะไรทำให้ "รีเซ็ต"?
ฉันเขียนสคริปต์ทุบตีเล็ก ๆ น้อย ๆ เพื่อดูว่าเกิดอะไรขึ้นเมื่อฉันติดตามลิงก์สัญลักษณ์ที่ชี้ไปยังไดเรกทอรีเดียวกัน ฉันคาดหวังว่ามันจะสร้างไดเร็กตอรี่ที่ใช้งานได้นานมากหรือพัง. แต่ผลที่ได้ทำให้ฉันประหลาดใจ ... mkdir a cd a ln -s ./. a for i in `seq 1 1000` do cd a pwd done บางส่วนของผลลัพธ์คือ ${HOME}/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a ${HOME}/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a ${HOME}/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a ${HOME}/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a ${HOME}/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a ${HOME}/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a ${HOME}/a ${HOME}/a/a ${HOME}/a/a/a ${HOME}/a/a/a/a ${HOME}/a/a/a/a/a ${HOME}/a/a/a/a/a/a ${HOME}/a/a/a/a/a/a/a ${HOME}/a/a/a/a/a/a/a/a เกิดอะไรขึ้นที่นี่
64 bash  symlink 

3
“ กับดัก…ออกจากระยะเวลา” จำเป็นจริงๆหรือ?
ตัวอย่างมากมายสำหรับtrapใช้trap ... INT TERM EXITสำหรับงานการล้างข้อมูล แต่มันจำเป็นจริงๆหรือไม่ที่จะแสดงรายการทั้งสาม sigspecs? คู่มือบอกว่า: หาก SIGNAL_SPEC เป็น EXIT (0) ARG จะถูกดำเนินการเมื่อออกจากเปลือก ซึ่งผมเชื่อว่าไม่ว่าจะใช้สคริปต์เสร็จได้ตามปกติหรือมันเสร็จเพราะมันได้รับหรือSIGINT SIGTERMการทดลองยืนยันความเชื่อของฉันด้วย: $ cat ./trap-exit #!/bin/bash trap 'echo TRAP' EXIT sleep 3 $ ./trap-exit & sleep 1; kill -INT %1 [1] 759 TRAP [1]+ Interrupt ./trap-exit $ ./trap-exit & sleep 1; kill -TERM %1 [1] …
63 bash  shell  signals  trap 

6
ฆ่างานพื้นหลังทั้งหมด
มีรูปแบบที่กะทัดรัดกว่าในการฆ่างานพื้นหลังมากกว่า: for i in {1..5}; do kill %$i; done นอกจากนี้ {1..5} เห็นได้ชัดว่ามีหมายเลขเวทย์มนตร์ที่เข้ารหัสยากฉันจะทำให้ "N" โดยที่ N เป็นหมายเลขที่ถูกต้องได้อย่างไรโดยไม่ต้องทำ: $(jobs | wc -l) ฉันใช้ \ j ใน PS1 จริง ๆ เพื่อให้ได้ # ของงานที่จัดการมันเทียบเท่ากันไหม
63 bash 

3
สคริปต์ทุบตีทั้งหมดเข้ากันได้กับ `zsh 'หรือไม่
ฉันต้องการเปลี่ยนจาก bash เป็น zsh แต่กังวลเกี่ยวกับความเข้ากันได้ของสคริปต์ทุบตี bash สคริปต์ / ฟังก์ชั่นทั้งหมดเข้ากันได้กับ zsh หรือไม่ ดังนั้นถ้าเป็นจริงก็คือ zsh เพียงการเพิ่มประสิทธิภาพในการทุบตี?
63 bash  zsh 

5
ไม่สามารถเยื้อง heredoc เพื่อให้ตรงกับการเยื้องของการซ้อน
หากมี "ปัญหาโลกครั้งแรก" สำหรับการเขียนสคริปต์นี่จะเป็นเช่นนั้น ฉันมีรหัสต่อไปนี้ในสคริปต์ที่ฉันอัปเดต: if [ $diffLines -eq 1 ]; then dateLastChanged=$(stat --format '%y' /.bbdata | awk '{print $1" "$2}' | sed 's/\.[0-9]*//g') mailx -r "Systems and Operations <sysadmin@[redacted].edu>" -s "Warning Stale BB Data" jadavis6@[redacted].edu <<EOI Last Change: $dateLastChanged This is an automated warning of stale data for the UNC-G …

6
ฉันสามารถกำหนดค่าเปลือกของฉันเพื่อพิมพ์ STDERR และ STDOUT ในสีที่ต่างกันได้หรือไม่?
ฉันต้องการตั้งค่าเทอร์มินัลของฉันเพื่อให้stderrพิมพ์ในสีที่แตกต่างกว่าstdout; อาจจะเป็นสีแดง นี่จะทำให้ง่ายต่อการบอกความแตกต่าง มีวิธีกำหนดค่านี้.bashrcไหม ถ้าไม่เป็นไปได้ไหม หมายเหตุ : คำถามนี้รวมกับอีกว่าขอให้stderr, stdout และผู้ใช้ป้อนก้องจะเป็นผลลัพธ์ใน3 สีที่แตกต่างกัน คำตอบอาจตอบคำถามใดคำถามหนึ่ง

6
คุณลักษณะใดบ้างที่อยู่ใน zsh และหายไปจาก bash หรือในทางกลับกัน
ในฐานะผู้ใช้ Linux ฉันมักจะใช้ bash เสมอเพราะเป็นค่าเริ่มต้นสำหรับทุก distro ที่ฉันใช้ คนที่ใช้ระบบ Unix อื่น ๆ เช่น BSD ดูเหมือนจะใช้เชลล์ตัวอื่นบ่อยกว่า เพื่อความสนใจในการเรียนรู้มากขึ้นฉันตัดสินใจลอง zsh ในฐานะผู้ใช้ทุบตี: ฉันจะพลาดฟีเจอร์อะไร และฉันควรระวังสิ่งใด
62 bash  zsh 

3
ทำไม bashrc ตรวจสอบว่าเชลล์ปัจจุบันมีการโต้ตอบหรือไม่?
บน Arch ของฉันติดตั้ง/etc/bash.bashrcและ/etc/skel/.bashrcมีบรรทัดเหล่านี้: # If not running interactively, don't do anything [[ $- != *i* ]] && return บน Debian /etc/bash.bashrcมี: # If not running interactively, don't do anything [ -z "$PS1" ] && return และ/etc/skel/.bashrc: # If not running interactively, don't do anything case $- in *i*) ;; *) …
62 bash  bashrc 

5
ชื่อเซิร์ฟเวอร์เติมข้อความอัตโนมัติสำหรับ SSH และ SCP
ฉันมีเซิร์ฟเวอร์ไม่กี่กำหนดค่าใน~/.ssh/configเช่นและalpha betaฉันจะกำหนดค่า Bash อย่างไรให้คำสั่งssh al<tab>และscp file.tgz al<tab>เติมชื่อของเซิร์ฟเวอร์ที่กำหนดค่าโดยอัตโนมัติ ฉันไม่ต้องการเพิ่มเซิร์ฟเวอร์ไปยังไฟล์อื่น (เช่นอาร์เรย์ Bash) ทุกครั้งที่มีการเพิ่มเนื่องจากเราเพิ่มและลบเซิร์ฟเวอร์เป็นประจำและรายการมีขนาดค่อนข้างใหญ่
61 bash  ssh  autocomplete  scp 

11
มีวิธีที่จะทำให้ "mv" ล้มเหลวอย่างเงียบ ๆ หรือไม่?
คำสั่งเช่นmv foo* ~/bar/ผลิตข้อความนี้ในการ stderr foo*ถ้ามีไฟล์ที่ตรงกับ mv: cannot stat `foo*': No such file or directory อย่างไรก็ตามในสคริปต์ฉันกำลังทำงานในกรณีนั้นจะไม่เป็นไรและฉันต้องการละเว้นข้อความนั้นจากบันทึกของเรา มีวิธีใดที่ดีที่จะบอกmvให้เงียบแม้ว่าจะไม่มีสิ่งใดเคลื่อนไหว
61 bash  mv 

9
วิธีการวัดเวลาของการดำเนินการของโปรแกรมและเก็บไว้ในตัวแปร
เพื่อค้นหาว่าการดำเนินการบางอย่างภายในสคริปต์ Bash (v4 +) ใช้เวลานานเท่าใดฉันต้องการแยกเอาต์พุตจากtimeคำสั่ง "แยก" และ (ท้ายที่สุด) จับภาพภายในตัวแปร Bash ( let VARNAME=...) ตอนนี้ฉันกำลังใช้time -f '%e' ...(หรือมากกว่าcommand time -f '%e' ...เพราะในตัวของ Bash) แต่เนื่องจากฉันเปลี่ยนเส้นทางเอาต์พุตของคำสั่งที่ดำเนินการไปtimeแล้ว โดยทั่วไปปัญหาที่นี่คือที่จะแยกการส่งออกของtimeจากผลลัพธ์ของคำสั่งประหารชีวิต (s) สิ่งที่ฉันต้องการคือฟังก์ชั่นการนับจำนวนเวลาเป็นวินาที (จำนวนเต็ม) ระหว่างการเริ่มต้นคำสั่งและความสมบูรณ์ มันไม่จำเป็นต้องเป็นtimeคำสั่งหรือในตัวที่เกี่ยวข้อง แก้ไข:เนื่องจากคำตอบที่มีประโยชน์สองคำตอบด้านล่างนี้ฉันต้องการเพิ่มคำอธิบายสองคำ ฉันไม่ต้องการทิ้งเอาต์พุตของคำสั่งที่เรียกใช้แล้ว แต่มันจะไม่สำคัญว่ามันจะจบลงด้วย stdout หรือ stderr ฉันต้องการวิธีการโดยตรงมากกว่าหนึ่งทางอ้อม (เช่นการจับเอาท์พุทโดยตรงแทนที่จะเก็บไว้ในไฟล์ระดับกลาง) การแก้ปัญหาโดยใช้dateมาไกลถึงสิ่งที่ฉันต้องการ


7
ฉันจะลบรายการที่ซ้ำกันใน. bash_history ของฉันเพื่อรักษาลำดับได้อย่างไร
ฉันสนุกกับการใช้control+rเพื่อค้นหาประวัติคำสั่งของฉันซ้ำ ๆ ฉันพบตัวเลือกที่ดีบางอย่างที่ฉันชอบใช้กับมัน: # ignore duplicate commands, ignore commands starting with a space export HISTCONTROL=erasedups:ignorespace # keep the last 5000 entries export HISTSIZE=5000 # append to the history instead of overwriting (good for multiple connections) shopt -s histappend ปัญหาเดียวสำหรับฉันคือการerasedupsลบรายการที่ซ้ำกันตามลำดับเท่านั้นดังนั้นด้วยคำสั่งสตริงนี้: ls cd ~ ls lsคำสั่งจริงจะถูกบันทึกไว้เป็นครั้งที่สอง ฉันคิดเกี่ยวกับการทำงานเป็นระยะ ๆ ด้วย: cat .bash_history | …

3
ทำความเข้าใจกับ“ IFS = read -r line”
ฉันเข้าใจชัดเจนว่าสามารถเพิ่มค่าให้กับตัวแปรตัวคั่นฟิลด์ภายในได้ ตัวอย่างเช่น: $ IFS=blah $ echo "$IFS" blah $ ฉันยังเข้าใจว่าread -r lineจะบันทึกข้อมูลจากstdinไปยังชื่อตัวแปรline: $ read -r line <<< blah $ echo "$line" blah $ อย่างไรก็ตามคำสั่งสามารถกำหนดค่าตัวแปรได้อย่างไร และเก็บข้อมูลจากstdinตัวแปรแรกlineแล้วให้ค่าของlineถึงIFSหรือไม่?

3
ด้วย BASH หลังจาก“ เลื่อน” ขึ้นไปยังคำสั่งก่อนหน้า…จะเลื่อนไปยังขั้นถัดไปในประวัติศาสตร์นี้ได้อย่างไร?
ขออภัยชื่อนี้ไม่ได้หรูหราที่สุดที่ฉันเคยคิด แต่ฉันคิดว่าผู้คนจำนวนมากจะสงสัยในสิ่งนี้และคำถามของฉันอาจจะเป็นคนหลอกลวง ... ทั้งหมดที่ฉันสามารถพูดได้คือฉันไม่ได้พบมัน เมื่อฉันพูดว่า "การเลื่อน" ขึ้นฉันหมายถึงการใช้ปุ่ม "ลูกศรขึ้น" บนแป้นพิมพ์ซึ่งเห็นได้ชัดว่าคุณเลื่อนขึ้นผ่านประวัติศาสตร์เริ่มต้นที่คำสั่งล่าสุด ดังนั้นคุณจะพบคำสั่งที่อาจ 30 คำสั่งกลับมา ... และคุณเรียกใช้ และจากนั้นคุณต้องการเรียกใช้คำสั่งที่มาหลังจากนั้น ... มีวิธีที่รวดเร็วในการทำเช่นนี้หรือ หรือคนที่พูดภาษา BASH คล่องแคล่วทำเช่นนี้ได้อย่างไร?

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