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

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

7
ทดสอบว่า file descriptor ถูกต้องหรือไม่
ฉันต้องการสร้างสคริปต์ทุบตีข้อมูลเพิ่มเติมให้กับ file descriptors (FDs) มากกว่าหรือเท่ากับ 3 เมื่อเปิด เพื่อทดสอบว่า FD เปิดอยู่หรือไม่ฉันได้วางแผนเคล็ดลับต่อไปนี้: if (printf '' 1>&3) 2>&-; then # File descriptor 3 is open else # File descriptor 3 is not open fi นี่เพียงพอสำหรับความต้องการของฉัน แต่ฉันอยากรู้ว่ามีวิธีการทดสอบที่เป็นไปตามสำนวนมากขึ้นหรือไม่ถ้า FD นั้นถูกต้อง ฉันสนใจเป็นพิเศษเกี่ยวกับว่ามีการแม็พfcntl(1)syscall กับคำสั่งเชลล์หรือไม่ซึ่งจะอนุญาตให้เรียกใช้แฟล็ก FD ( O_WRONLYและ O_RDWRเพื่อทดสอบว่า FD สามารถเขียนได้หรือไม่O_RDONLYและ O_RDWRเพื่อทดสอบว่า FD อ่านได้หรือไม่)

4
นับจำนวนไฟล์ในไดเรกทอรีที่มีสตริงชื่อเฉพาะหรือไม่
ฉันมีไฟล์ต่อไปนี้: Codigo-0275_tdim.matches.tsv Codigo-0275_tdim.snps.tsv FloragenexTdim_haplotypes_SNp3filter17_single.tsv FloragenexTdim_haplotypes_SNp3filter17.tsv FloragenexTdim_SNP3Filter17.fas S134_tdim.alleles.tsv S134_tdim.snps.tsv S134_tdim.tags.tsv ฉันต้องการนับจำนวนไฟล์ที่มีคำsnp(ตัวพิมพ์เล็กและใหญ่) ในชื่อของพวกเขา ฉันพยายามใช้ grep -a 'snp' | wc -l แต่ฉันก็รู้ว่าgrepค้นหาในไฟล์ คำสั่งที่ถูกต้องในการสแกนชื่อไฟล์คืออะไร?
12 bash 

2
จะเลิกทำการเปลี่ยนแปลงใน command-history ได้อย่างไร?
ในระบบ UNIX คุณสามารถกดลูกศรบนและล่างเพื่อเลื่อนดูคำสั่งก่อนหน้า มันมีประโยชน์มาก บางครั้งฉันก็ขึ้นไปและพบคำสั่งที่ฉันต้องการใช้อีกครั้ง แต่มีรูปแบบบางอย่าง historyถ้าฉันจะเปลี่ยนแปลงดังกล่าวแล้วผมไม่ได้มีวิธีการที่จะได้รับกลับคำสั่งเดิมจนกว่าฉันตรวจสอบใน มีวิธีใดบ้างที่จะ "เลิกทำ" การเปลี่ยนแปลงคำสั่งในประวัติการเข้าใช้ผ่านทางคีย์? วิธีแก้ปัญหาปัจจุบันของฉันคือการผนวก#คำสั่ง วิธีนี้ดำเนินการคำสั่งปัจจุบันเป็นความคิดเห็นจึงไม่มีอะไรเกิดขึ้น จากนั้นฉันสามารถเรียกดูอีกครั้งผ่านคำสั่งด้วยปุ่มต่างๆ ปัญหาคือว่าคำสั่งที่ฉันใช้อาจจะเป็นรายการที่อยู่ห่างไกลในรายการดังนั้นการขึ้นอีกสองร้อยครั้งนั้นค่อนข้างน้อย Control + R ไม่ใช่วิธีแก้ปัญหาอย่างใดอย่างหนึ่งเนื่องจากฉันอาจจำไม่ได้ว่าสิ่งที่ฉันกำลังมองหา ตัวอย่าง ฉันพิมพ์ "50 คำสั่งที่ผ่านมา" ต่อไปนี้: ls -l /etc/httpd/conf/ ตอนนี้ฉันขึ้นไปที่บรรทัดนั้นและเปลี่ยนเป็น ls -l /etc/init.d/ แต่ไม่ได้กด Enter ตอนนี้ฉันต้องการไปที่ls -l /etc/httpd/conf/อีกครั้ง สภาพแวดล้อมของฉัน $ echo $SHELL /bin/bash $ echo $TERM xterm

2
สร้างตัวแปรและกำหนดค่าผ่านทางลูป (ทุบตี)
มีวิธีสร้างตัวแปร bash และกำหนดค่าผ่านลูปหรือไม่ บางสิ่งบางอย่างตาม: #!/bin/bash c=0 for file in $( ls ); do var"$c"="$file"; let c=$c+1; done แก้ไข: ขอบคุณ @Costas และ @mdpc สำหรับการชี้ให้เห็นว่านี่จะเป็นทางเลือกที่ไม่ดีสำหรับรายการ คำถามเป็นเชิงทฤษฎีเท่านั้น

3
มีวิธีที่จะมีฟังก์ชั่นในสคริปต์อัตโนมัติทุบตีของฉันทำงานกับข้อผิดพลาดคำสั่งใด ๆ ?
ฉันกำลังเขียนเชลล์สคริปต์ที่ต้องทำพวงคำสั่งและทุกคำสั่งขึ้นอยู่กับทุกคำสั่งก่อนหน้า หากคำสั่งใด ๆ ล้มเหลวสคริปต์ทั้งหมดควรล้มเหลวและฉันเรียกใช้ฟังก์ชัน exit ฉันสามารถตรวจสอบรหัสออกของแต่ละคำสั่ง แต่ฉันสงสัยว่ามีโหมดที่ฉันสามารถเปิดใช้งานหรือวิธีการทุบตีให้ทำโดยอัตโนมัติ ตัวอย่างเช่นใช้คำสั่งเหล่านี้: cd foo || myfunc rm a || myfunc cd bar || myfunc rm b || myfunc มีวิธีที่ฉันสามารถส่งสัญญาณไปยังเปลือกอย่างใดก่อนที่จะดำเนินการคำสั่งเหล่านี้ว่ามันควรจะเรียก myfunc หากพวกเขาล้มเหลวเพื่อให้ฉันสามารถเขียนสิ่งที่สะอาดเช่น: cd foo rm a cd bar rm b

5
วิธีอ่านบางบรรทัดหลังจากค้นหาข้อความ
ฉันจะอ่านจำนวนบรรทัดหลังจากค้นหาข้อความได้อย่างไร เช่น.: อ่าน 2 บรรทัดถัดไปหลังจากค้นหา "Unix" บน: Test 1 Test 2 Test 3 Test 4 UNIX Test 5 Test 6 Test 7 Test 8 Test 9 ผลลัพธ์สามารถ: Test 5 Test 6 หมายเหตุ: "Unix" ในตัวอย่างที่ผ่านมาเป็นอาร์กิวเมนต์และมันอาจเป็นข้อความอื่น ๆ สิ่งที่ฉันมี: ฉันยังขาดความคิดต้องการแค่แสงสว่าง กำลังคิดที่จะสร้างสคริปต์อื่นขึ้นมาเพื่อทำสิ่งนั้น
12 bash  shell 

5
เชลล์แบบไม่โต้ตอบขยายนามแฝง
ฉันมีปัญหาในการรับชื่อแทนเพื่อขยายบัญชีโฮสติ้งของฉันเมื่อฉันเรียกใช้คำสั่งเช่น: ssh user@server "bash -c \"alias\"" ไฟล์. bashrc ของฉันคือ: echo .bashrc # .bashrc shopt -s expand_aliases # Source global definitions (commenting this out does nothing) if [ -f /etc/bashrc ]; then . /etc/bashrc fi # User specific aliases and functions alias php="php55" alias composer="php ~/bin/composer.phar" เมื่อฉันเรียกใช้คำสั่ง ssh ฉันเห็น ".bashrc" echo'd …
12 bash  ssh  alias  bashrc 

3
วิธีเริ่มต้น XTerm ด้วยพรอมต์ที่ด้านล่าง?
เมื่อเริ่มต้น XTerm พรอมต์จะเริ่มที่บรรทัดแรกของเทอร์มินัล เมื่อรันคำสั่งพรอมต์จะเลื่อนลงมาจนกระทั่งถึงด้านล่างและจากนั้นจะอยู่ที่นั่น (ไม่ใช่แม้กระทั่งShift- Page Downหรือเมาส์สามารถเปลี่ยนได้) แทนที่จะเริ่มต้นอายุการใช้งานเทอร์มินัลให้เป็น "พิเศษ" การแจ้งเตือนควรอยู่ที่ด้านล่างของเครื่อง โปรดทราบว่าฉันมีหลายคู่สายพร้อมท์ แน่นอนว่ามันควรจะทำงานได้เหมือนเดิม (ปรับขนาดเลื่อนได้ไม่มีบรรทัดใหม่ที่ไม่จำเป็นในเอาต์พุตและไม่มีเอาต์พุตหายไปอย่างลึกลับ) ดังนั้นPROMPT_COMMAND='echo;echo;...'หรือคล้ายกันไม่ใช่ตัวเลือก การแก้ปัญหาไม่ควรเป็นแบบเฉพาะเชลล์ แก้ไข: วิธีการแก้ปัญหาในปัจจุบันในขณะที่ทำงานในกรณีที่เรียบง่ายมีไม่กี่ประเด็น: มันทุบตีที่เฉพาะเจาะจง ทางออกที่ดีควรพกพาไปหากระสุนอื่นได้ มันล้มเหลวถ้ากระบวนการอื่น ๆ PS1ปรับเปลี่ยน ตัวอย่างหนึ่งคือ virtualenv ซึ่งจะเพิ่ม(virtualenv)ที่จุดเริ่มต้นของPS1ซึ่งก็มักจะหายไปเพียงแค่ครึ่งหน้าบน Ctrl- lตอนนี้ลบหน้าสุดท้ายของประวัติศาสตร์ มีวิธีที่จะหลีกเลี่ยงปัญหาเหล
12 bash  terminal  xterm 

2
ปิดใช้งานแคชของไฟล์เรียกทำงานของ bash ในพา ธ
โปรดทราบว่านี่ไม่ซ้ำกัน ฉันกำลังถามเกี่ยวกับการปิดการใช้งานแคชไม่ล้างมัน หากคุณมีแคชเพื่อล้างข้อมูลจะไม่ถูกปิดใช้งาน ในโอกาสที่หายากที่ฉันสังเกตเห็นแคชของ bash ของสิ่งที่พบในเส้นทางไม่ใช่เพราะมีประโยชน์เพราะเป็นเลือดที่น่ารำคาญ ตัวอย่าง: ~ dc$ export PATH=$HOME/bin:$PATH ~ dc$ cat bin/which #!/bin/bash echo "my which" ~ dc$ which my which ~ dc$ rm bin/which ~ dc$ which which -bash: /Users/dc/bin/which: No such file or directory ในอีกเปลือก ... ~ dc$ which which /usr/bin/which ฉันแน่ใจว่าแคชนี้ใช้งานได้ดีในสมัยก่อนเมื่อดิสก์ช้าและหน่วยความจำมีราคาแพงและ จำกัด ดังนั้นคุณจึงไม่สามารถแคชได้มากนัก - …
12 bash 

3
อะไรคือความแตกต่างของ -a และ -e ในนิพจน์เงื่อนไขของ bash?
จากman bash: CONDITIONAL EXPRESSIONS [...] -a file True if file exists. [...] -e file True if file exists. แล้วอะไรคือความแตกต่างระหว่าง[ -a $FILE ]และ[ -e $FILE ]ถ้ามี? หากไม่มีความแตกต่างจริงเหตุใดจึงมีค่าสถานะสองค่าสำหรับจุดประสงค์เดียวกัน
12 bash  shell  test 

1
ฉันจะหยุดสี bash shell PS1 เพื่อหยุดที่ส่วนท้ายของคำสั่งได้อย่างไร
ฉันมีสี PS1 ที่กำหนดเองซึ่งฉันมีคำสั่งเชลล์จริงในสีที่แตกต่างดังนั้นฉันจึงสามารถดูว่าคำสั่งใดที่ฉันพิมพ์และแยกออกจากเอาต์พุตคำสั่งอย่างรวดเร็ว สมมติว่าสีใน PS1 ถูกตั้งค่าเป็น 'สีน้ำเงิน' สำหรับพรอมต์คำสั่งและสีเริ่มต้นในเปลือกของฉันเป็นสีขาว ฉันพิมพ์คำสั่งเช่น ls (ls -l เป็นสีน้ำเงิน) เอาต์พุตที่สร้างขึ้นบรรทัดแรกยังคงเป็นสีน้ำเงิน เส้นที่เหลือทั้งหมดมาเป็นสีขาว สิ่งที่ฉันต้องการคือผลลัพธ์ทั้งหมดหลังจากคำสั่งให้เป็น 'สีขาว' ตัวอย่างอื่น: ฉันพิมพ์คำสั่ง 'cat' สีจะเป็นสีน้ำเงิน เอาท์พุทมาเอาท์พุททั้งหมดเป็นสีฟ้า ฉันต้องการให้ผลลัพธ์เป็น 'สีขาว' ในขณะที่ยังคงพร้อมท์คำสั่งที่ฉันพิมพ์ 'สีน้ำเงิน' ในบางคำสั่งมันดีคำสั่งอื่น ๆ สีเดียวกันล้นในบรรทัดแรกของการส่งออกแล้วสีเริ่มต้นเตะในและคำสั่งอื่น ๆ บางส่วนเอาท์พุททั้งหมด (เช่น cat) มีสีเดียวกัน มีวิธีการเก็บเฉพาะคำสั่งที่ฉันพิมพ์ในสีเดียวและที่เหลือเป็นค่าเริ่มต้นหรือไม่? ฉันใช้ OSX แก้ไข # 1 นี่คือภาพหน้าจอที่ @ derobert เชื่อมโยงกับความคิดเห็นที่แสดงสิ่งที่ฉันกำลังมองหา
12 bash  prompt 

5
คุณหยุด 'wget' หลังจากที่ได้รับ 404 ได้อย่างไร
หากคุณใช้การขยายรั้งด้วยwgetคุณสามารถดึงภาพที่มีหมายเลขตามลำดับได้อย่างง่ายดาย: $ wget 'http://www.iqandreas.com/sample-images/100-100-color/'{90..110}'.jpg' มันดึง 10 ไฟล์แรก90.jpgที่ถูก99.jpgปรับให้เป็นตัวเลขแต่100.jpgกลับมาเป็นข้อผิดพลาด404: ไฟล์ไม่พบไฟล์ (ฉันมีเพียง 100 ภาพเก็บไว้ในเซิร์ฟเวอร์) ไฟล์ที่ไม่มีอยู่เหล่านี้กลายเป็น "ปัญหา" มากกว่าถ้าคุณใช้ช่วงที่ใหญ่กว่าเช่น{00..200}ด้วยไฟล์ที่ไม่มีอยู่ 100 ไฟล์มันจะเพิ่มเวลาในการเรียกใช้งานสคริปต์และอาจกลายเป็นภาระเล็กน้อย (หรืออย่างน้อยก็สร้างความรำคาญ) เซิฟเวอร์. มีวิธีใดบ้างที่wgetจะหยุดหลังจากได้รับข้อผิดพลาด 404 ครั้งแรกหรือไม่ (หรือดียิ่งขึ้นสองในแถวในกรณีที่มีไฟล์หายไปในช่วงด้วยเหตุผลอื่น) คำตอบไม่จำเป็นต้องใช้การขยายรั้ง; ลูปก็ดีเช่นกัน

2
เหตุใด BASH จึงพิมพ์“ bash: cd: write error: Success”
วันนี้ฉันสังเกตเห็นหลายครั้ง หากฉันพิมพ์cd ../Directoryเพื่อเปลี่ยนเป็นไดเร็กทอรีอื่นจะพิมพ์ "bash: cd: write error: Success" ฉันไม่สามารถกำหนดคำสั่งก่อนหน้านี้ที่เกี่ยวข้องกับสิ่งนี้ได้ typeset -f พิมพ์อะไร alias พิมพ์อะไร type -a cd พิมพ์ "cd เป็นเชลล์ในตัว" echo $CDPATH พิมพ์บรรทัดว่าง $BASH_VERSION พิมพ์ "bash: 4.2.37 (1) -release: ไม่พบคำสั่ง" ฉันสังเกตแค่ 2-3 ครั้งเท่านั้น ไดเร็กทอรีเริ่มต้นและไดเร็กทอรีเป้าหมายเหมือนกันในทั้งสองสถานการณ์ ฉันเปลี่ยนไดเรกทอรีในลักษณะนี้หลายครั้ง แต่ไม่พบข้อผิดพลาดเสมอ สิ่งที่อาจทำให้เกิดสิ่งนี้
12 bash 

5
ใช้ $ หรือเปล่า ในคำสั่ง if
function foo { (cd $FOOBAR; <some command> if [$? -ne 0] then echo "Nope!" else echo "OK!" fi ) } ฉันพยายามเขียนฟังก์ชั่นแบบเดียวกับข้างบนและวางไว้ในไฟล์. bashrc ของฉัน หลังจากที่ฉันส่งไฟล์และเรียกใช้ฉันจะได้รับ: เวลาทั้งหมด: 51 วินาที -bash: [1: ไม่พบคำสั่ง ตกลง! มีใครช่วยฉันเข้าใจสิ่งที่ฉันทำผิดหรือเปล่า?
12 bash  scripting 

8
ทดสอบพอร์ต TCP ระยะไกลโดยใช้ telnet โดยเรียกใช้คำสั่งหนึ่งบรรทัด
ฉันมีกล่องลินุกซ์มากมายพร้อมชุดคำสั่งและพื้นที่ดิสก์ที่ จำกัด มาก แต่มันมีtelnetคำสั่งอยู่ ฉันเชื่อมต่อกับโพรบเหล่านี้จากทางไกล (โดยทางโปรแกรม) และออกคำสั่ง linux หนึ่งบรรทัดผ่าน SSH ฉันจำเป็นต้องเรียกใช้คำสั่งเดียวที่จะเชื่อมต่อไปยังเครื่องที่เฉพาะเจาะจงโดยใช้ Telnet, และจากนั้นตัดการเชื่อมต่อได้ทันที ฉันจะทำทุกอย่างที่ แต่ขาดการเชื่อมต่อได้ทันทีส่วนหนึ่ง Telnet เปิดคอนโซลหรือเทอร์มินัลบางประเภทและฉันไม่สามารถหาคำสั่งหนึ่งบรรทัดเพื่อเรียกใช้คำสั่ง telnet แล้วตัดการเชื่อมต่อได้ทันที ถ้าฉันทำเช่นนั้นฉันสามารถแยกวิเคราะห์ข้อความที่เป็นข้อความสำหรับข้อผิดพลาดที่ไม่สามารถเชื่อมต่อกับเครื่องบนพอร์ตที่ระบุและนั่นคือสิ่งที่ฉันกำลังมองหา ดังนั้นฉันจะเรียกใช้คำสั่งหนึ่งบรรทัดเพื่อเชื่อมต่อกับเครื่องโดยใช้ telnet และตัดการเชื่อมต่อในภายหลังได้อย่างไร
12 bash  telnet 

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