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

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

9
วิธีพิมพ์ตัวแปรที่กำหนดไว้เฉพาะ (เชลล์และ / หรือตัวแปรสภาพแวดล้อม) ใน bash
คำสั่ง bash builtin setหากเรียกใช้โดยไม่มีอาร์กิวเมนต์จะพิมพ์ตัวแปรเชลล์และสภาวะแวดล้อมทั้งหมด แต่รวมถึงฟังก์ชันที่กำหนดไว้ทั้งหมด grepนี้จะทำให้การส่งออกใช้ไม่ได้สำหรับมนุษย์และยากที่จะ ฉันจะทำให้คำสั่ง bash builtin setพิมพ์เฉพาะตัวแปรและไม่ใช่ฟังก์ชันได้อย่างไร มีคำสั่งอื่นที่พิมพ์เฉพาะตัวแปรเชลล์โดยไม่มีฟังก์ชั่นหรือไม่? หมายเหตุ: ทุบตีแตกต่างระหว่างตัวแปรเชลล์และตัวแปรสภาพแวดล้อม ดูที่นี่ความแตกต่างระหว่างตัวแปรสภาพแวดล้อมและตัวแปรสภาพแวดล้อมที่ส่งออกใน bash

2
วิธีการนับความยาวของอาร์เรย์ที่กำหนดไว้ในทุบตี?
ฉันใหม่เพื่อทุบตีและไม่สามารถหาบทช่วยสอนที่ดีเพื่อตอบคำถามของฉัน array=( item1 item2 item3) for name in ${array[@]}; do echo current/total ... some other codes done ฉันต้องการคำนวณค่า "ปัจจุบัน" และ "รวม" ตามที่คาดหวังเอาท์พุทของสิ่งนี้: 1/3 2/3 3/3 ขอบคุณสำหรับเคล็ดลับใด ๆ
57 bash  array 

4
เส้นประหรือเปลือกอื่น ๆ “ เร็วขึ้น” กว่าทุบตีหรือไม่
ฉันคิดเสมอว่าประโยชน์เพียงอย่างเดียวของการใช้เครื่องหมายขีดคั่นแทนการทุบตีก็คือเส้นประนั้นเล็กลงและดังนั้นกรณีของเส้นประจะเริ่มเร็วขึ้นในเวลาบูต แต่ฉันได้ทำการวิจัยมาแล้วและพบว่ามีคนบางคนย้ายสคริปต์ทั้งหมดของพวกเขาไปที่หวังว่าพวกเขาจะทำงานได้เร็วขึ้นและฉันก็พบสิ่งนี้ในบทความDashAsBinShใน Ubuntu Wiki: เหตุผลสำคัญที่จะเปลี่ยนเปลือกเริ่มต้นได้อย่างมีประสิทธิภาพ bash เป็นกระสุนเต็มรูปแบบที่ยอดเยี่ยมเหมาะสำหรับการใช้แบบโต้ตอบ; แท้จริงมันยังคงเป็นเปลือกเข้าสู่ระบบเริ่มต้น อย่างไรก็ตามมันค่อนข้างใหญ่และช้าในการเริ่มต้นและใช้งานโดยเปรียบเทียบกับเส้นประ ทุกวันนี้ฉันใช้สคริปต์ทุบตีมากมายหลายอย่างในระบบของฉันและปัญหาของฉันคือฉันมีสคริปต์เฉพาะที่ฉันทำงานอย่างต่อเนื่อง 24/7 ที่วางไข่เด็กประมาณ 200 คนซึ่งคอมพิวเตอร์ของฉันร้อนขึ้น 10 ° C มากกว่าการใช้งานปกติ มันเป็นสคริปต์ที่ค่อนข้างใหญ่ที่มี bashisms จำนวนมากดังนั้นการย้ายไปที่ POSIX หรือเชลล์อื่น ๆ ใช้เวลานานมาก (และ POSIX ไม่สำคัญสำหรับการใช้งานส่วนตัว) แต่มันจะคุ้มค่าถ้าฉันสามารถลดบางสิ่งนี้ การใช้งาน CPU ฉันรู้ว่ายังมีสิ่งอื่น ๆ ที่จะต้องพิจารณาเช่นการเรียกไบนารีภายนอกเช่นsedสำหรับ bashism ง่ายๆเช่น${foo/bar}หรือแทนgrep=~ TL; DRทุบตีช้ากว่าจริง ๆ เมื่อเริ่มต้นและใช้งานเมื่อเปรียบเทียบกับขีดกลางหรือไม่ มี Unix shell อื่น ๆ ซึ่งมีประสิทธิภาพมากกว่าการทุบตีหรือไม่?
57 bash  performance  dash 

1
สำหรับลูปใน zsh และ bash
ฉันได้สังเกตว่ามีสองวิธีในการสร้างลูปในzsh : for x (1 2 3); do echo $x; done for x in 1 2 3; do echo $x; done พวกเขาทั้งสองพิมพ์: 1 2 3 คำถามของฉันคือทำไมทั้งสองไวยากรณ์ มีการ$xทำซ้ำผ่านที่แตกต่างกันชนิดของวัตถุในแต่ละของพวกเขา? ไม่ทุบตีทำให้ความแตกต่างที่คล้ายกัน? ภาคผนวก: ทำไมงานต่อไปนี้: #!/bin/zsh a=1 b=2 c=5 d=(a b c) for x in $d; do print $x;done แต่อันนี้ไม่ได้: #!/bin/zsh a=1 b=2 c=5 d=(a …
57 bash  zsh 

5
ฉันจะได้รับ bash เสร็จสิ้นสำหรับนามแฝงคำสั่งได้อย่างไร
ฉันกำลังมองหาที่จะได้รับแท็บเสร็จในนามแฝงบรรทัดคำสั่งของฉันเช่นว่าฉันกำหนดนามแฝงต่อไปนี้: alias apt-inst='sudo aptitude install' มีวิธีรับความสำเร็จที่จัดทำโดยความถนัดเมื่อฉันกดปุ่มแท็บหรือไม่ นั่นคือเมื่อฉันเขียน 'sudo aptitude install gnumer' และแท็บ Hit ความถนัดจะทำสิ่งนี้ให้เป็น gnumeric หรือหากมีความไม่แน่นอนแสดงรายการแพ็คเกจทั้งหมดที่เริ่มต้นด้วย gnumer ถ้าฉันทำโดยใช้นามแฝงของฉันไม่มีอะไร - ไม่เสร็จ

1
เปลี่ยนการอนุญาตของไฟล์ด้วยความช่วยเหลือของแมวของฉัน
root@system:~# less myfile -bash: /bin/less: Input/output error ระบบไฟล์รูทตาย แต่แมวของฉันยังมีชีวิตอยู่ (ในความทรงจำของฉัน): root@system:~# cat > /tmp/somefile C^d root@system:~# เขาเป็นคนขี้เหงา แต่เพื่อน ๆ ของเขาก็จากไปแล้ว: root@system:~# mount -bash: /bin/mount: Input/output error root@system:~# dmesg -bash: /bin/dmesg: Input/output error root@system:~# less -bash: /bin/less: Input/output error root@system:~# chmod -bash: /bin/chmod: Input/output error ระบบยังคงทำงานอยู่และบรรลุตามวัตถุประสงค์ ฉันรู้ว่าฉันรู้ว่าการตอบสนองที่มีเหตุผลเพียงอย่างเดียวของเรื่องนี้คือทำให้ระบบล่มและแทนที่ไดรฟ์ราก น่าเสียดายที่มันไม่ใช่ตัวเลือกเพราะมันต้องใช้เวลาและเงินเป็นจำนวนมาก นอกจากนี้มันจะฆ่าแมวของฉันและนั่นจะทำให้ฉันเศร้า ฉันคิดว่าจะพาเขาไปหาเพื่อนผู้บริจาคของเขา ฉันไม่กล้าลอง …

3
ความแตกต่างระหว่าง“ cd -” และ“ cd ~ -”
คำสั่ง Bash cd - พิมพ์ไดเรกทอรีที่ใช้ก่อนหน้านี้และเปลี่ยนแปลงไป ในทางกลับกันคำสั่ง Bash cd ~- เปลี่ยนเป็นไดเรกทอรีที่ใช้ก่อนหน้าโดยตรงโดยไม่ต้องสะท้อนอะไรเลย นั่นคือความแตกต่างเท่านั้น? กรณีการใช้งานสำหรับแต่ละคำสั่งคืออะไร?

2
sudo เป็นผู้ใช้รายอื่นที่มีสภาพแวดล้อม
$ whoami admin $ sudo -S -u otheruser whoami otheruser $ sudo -S -u otheruser /bin/bash -l -c 'echo $HOME' /home/admin เหตุใดจึงไม่$HOMEถูกตั้งค่าเป็น/home/otheruserแม้ว่า bash จะถูกเรียกใช้เป็นเชลล์การเข้าสู่ระบบ โดยเฉพาะ/home/otheruser/.bashrcไม่ได้มีที่มา นอกจากนี้ยัง/home/otheruser/.profileไม่ได้รับที่มา - ( /home/otheruser/.bash_profileไม่มีอยู่) แก้ไข: ปัญหาจริงคือhttps://stackoverflow.com/questions/27738224/mkvirtualenv-with-fabric-as-another-user-fails

4
su ไม่ได้เปลี่ยนผู้ใช้ แต่ไม่ตอบสนองด้วยข้อผิดพลาดเช่นกัน
ในขณะที่เข้าสู่ระบบในขณะที่rootฉันต้องการให้suผู้ใช้ปกติที่เฉพาะเจาะจง ฉันเรียกใช้su usernameและได้รับพรอมต์ทันทียังคงเป็นราก ไม่มีข้อผิดพลาดให้ ฉันรู้เรื่อง "ผู้ใช้ที่คุณพยายามจะไม่ได้รับอนุญาตสำหรับโฟลเดอร์ที่คุณกำลังมีปัญหา" และนั่นไม่ใช่กรณีในสถานการณ์นี้ นอกจากนี้ยังไม่มีข้อผิดพลาดปรากฏขึ้นซึ่งมักเป็นกรณี (เท่าที่ฉันรู้) เมื่อพบปัญหาสิทธิ์ที่เฉพาะเจาะจง ฉันพยายามsu - usernameด้วยเอฟเฟกต์เดียวกัน คำสั่งถูกประมวลผลไม่เห็นข้อผิดพลาดและฉันได้รับพรอมต์กลับมาทันที สิ่งที่อาจทำให้เกิดพฤติกรรมนี้ ฉันจะแก้ไขปัญหานี้ได้อย่างไร
56 bash  su 


8
ข้อดีของการใช้ set -o vi
ฉันเห็นนักพัฒนาหลายคนใช้คำสั่งนี้เพื่อตั้งค่าตัวเลือกเป็น vi ฉันไม่เคยเข้าใจการใช้งานจริงของสิ่งนี้? เมื่อใช้คำสั่ง bash การสลับไปใช้ vi ช่วยอะไรได้บ้าง
55 bash  vim  vi 

4
“ esac” หมายถึงอะไรในตอนท้ายของคำสั่ง bash case? จำเป็นหรือไม่
ฉันพบตัวอย่าง "esac" หลายรายการที่ท้ายคำสั่ง bash case แต่ฉันไม่พบเอกสารที่ชัดเจนเกี่ยวกับการใช้งาน หน้าคนใช้มันและยังมีดัชนีในคำว่า ( https://www.gnu.org/software/bash/manual/bashref.html#index-esac ) แต่ไม่ได้กำหนดให้ใช้ มันเป็นวิธีที่จำเป็นในการจบคำสั่งกรณีวิธีปฏิบัติที่ดีที่สุดหรือเทคนิคบริสุทธิ์
55 bash  case 

13
ทรัพยากรที่มีประสิทธิภาพมากที่สุดในการนับจำนวนไฟล์ในไดเรกทอรีคืออะไร?
CentOS 5.9 ฉันเจอปัญหาเมื่อวันก่อนที่ไดเรกทอรีมีไฟล์จำนวนมาก เมื่อต้องการนับฉันวิ่งls -l /foo/foo2/ | wc -l ปรากฎว่ามีมากกว่า 1 ล้านไฟล์ในไดเรกทอรีเดียว (เรื่องยาว - สาเหตุที่แท้จริงได้รับการแก้ไข) คำถามของฉันคือ: มีวิธีที่เร็วกว่าในการนับหรือไม่ อะไรจะเป็นวิธีที่มีประสิทธิภาพที่สุดในการนับ?
55 bash  shell  directory  ls 

5
การต่อท้ายวันที่ปัจจุบันจากตัวแปรไปยังชื่อไฟล์
ฉันพยายามต่อท้ายวันที่ปัจจุบันต่อท้ายชื่อไฟล์ดังนี้: TheFile.log.2012-02-11 นี่คือสิ่งที่ฉันมี: set today = 'date +%Y' mkdir -p The_Logs & find . -name The_Logs -atime -1 -type d -exec mv \{} "The_Logs_+$today" \; & อย่างไรก็ตามสิ่งที่ฉันได้รับคือชื่อของไฟล์และจะไม่มีการต่อท้าย ฉันจะต่อท้ายวันที่ปัจจุบันกับชื่อไฟล์ได้อย่างไร
55 bash  shell  rename  date 

6
ฉันจะได้รับทุบตีเพื่อออกจากความล้มเหลว backtick ในลักษณะที่คล้ายกับ pipefail ได้อย่างไร
ดังนั้นฉันชอบที่จะทำให้สคริปต์ทุบตีของฉันแข็งขึ้นทุกที่ที่ฉันสามารถทำได้ (และเมื่อไม่สามารถมอบหมายให้เป็นภาษาเช่น Python / Ruby) เพื่อให้แน่ใจว่าข้อผิดพลาดจะไม่หายไป ในหลอดเลือดดำนั้นฉันมีเคร่งครัด. sh ซึ่งมีสิ่งต่าง ๆ เช่น: set -e set -u set -o pipefail และแหล่งที่มาในสคริปต์อื่น ๆ อย่างไรก็ตามในขณะที่ pipefail จะรับ: false | echo it kept going | true มันจะไม่รับ: echo The output is '`false; echo something else`' ผลลัพธ์จะเป็น ผลลัพธ์คือ '' False ส่งคืนสถานะที่ไม่เป็นศูนย์และไม่มีการ stdout ในไปป์มันจะล้มเหลว แต่ที่นี่ไม่มีข้อผิดพลาดเกิดขึ้น เมื่อนี่เป็นการคำนวณที่เก็บไว้ในตัวแปรจริงในภายหลังและตั้งค่าเป็นค่าว่างนี่อาจทำให้เกิดปัญหาในภายหลัง ดังนั้น …

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