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

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

3
แทร็บ 'Ctrl + c' สำหรับสคริปต์ทุบตี แต่ไม่เปิดสำหรับกระบวนการในสคริปต์นี้
ฉันพยายามที่จะมีโปรแกรมแบบโต้ตอบในสคริปต์ทุบตี: my_program และฉันต้องการปิดด้วย 'Ctrl + c' แต่เมื่อฉันทำมันสคริปต์ของฉันก็ปิดเช่นกัน ฉันรู้เกี่ยวกับ trap '' 2 my_program trap 2 แต่ในกรณีนี้ฉันไม่สามารถปิดmy_programด้วย Ctrl + c คุณมีความคิดวิธีการอนุญาตให้ Ctrl + c ในโปรแกรม แต่ไม่ปิดสคริปต์ทำงานหรือไม่ แก้ไข: เพิ่มตัวอย่าง #!/bin/bash my_program my_program2 ถ้าฉันใช้ Ctrl + C เพื่อใกล้my_program, my_program2ไม่เคยดำเนินการเพราะสคริปต์ทั้งหมดจะออก
11 bash  trap 

2
ทำไมเวลาไม่ถึงในคู่มือทุบตี GNU?
[fakename]$ help time time: time [-p] pipeline Report time consumed by pipeline's execution... จากนี้ดูเหมือนว่าtimeเป็น Bash builtin แต่ผมไม่สามารถหาคำอธิบายได้ในหน้าเว็บนี้: https://www.gnu.org/software/bash/manual/html_node/Shell-Builtin-Commands.html#Shell-Builtin-Commands เหตุใดจึงเป็นเช่นนี้
11 bash  man  time 

1
Bash มีปัญหาประสิทธิภาพการทำงานโดยใช้รายการอาร์กิวเมนต์?
แก้ไขในทุบตี 5.0 พื้นหลัง สำหรับพื้นหลัง (และความเข้าใจ (และพยายามหลีกเลี่ยง downvotes คำถามนี้ดูเหมือนจะดึงดูด)) ฉันจะอธิบายเส้นทางที่พาฉันไปที่ปัญหานี้ (ดีที่สุดที่ฉันจำได้ในสองเดือนต่อมา) สมมติว่าคุณทำการทดสอบเชลล์สำหรับรายการอักขระ Unicode: printf "$(printf '\\U%x ' {33..200})" และมีอักขระ Unicode มากกว่า 1 ล้านตัวการทดสอบ 20,000 ตัวนั้นดูเหมือนจะไม่มาก นอกจากนี้สมมติว่าคุณตั้งค่าอักขระเป็นอาร์กิวเมนต์ตำแหน่ง: set -- $(printf "$(printf '\\U%x ' {33..20000})") ด้วยความตั้งใจที่จะส่งผ่านตัวละครไปยังแต่ละฟังก์ชั่นเพื่อประมวลผลพวกเขาในรูปแบบที่แตกต่างกัน ดังนั้นฟังก์ชั่นควรมีรูปแบบtest1 "$@"หรือคล้ายกัน ตอนนี้ฉันรู้แล้วว่าความคิดนี้เลวร้ายแค่ไหน ทีนี้สมมติว่าจำเป็นต้องใช้เวลา (n = 1,000) แต่ละวิธีแก้ปัญหาเพื่อค้นหาว่าดีกว่าภายใต้เงื่อนไขเช่นนี้คุณจะจบลงด้วยโครงสร้างที่คล้ายกับ: #!/bin/bash -- TIMEFORMAT='real: %R' # '%R %U %S' set …
11 linux  bash  time 

2
อายุขัยของไฟล์ descriptor คืออะไร?
ตามที่อธิบายไว้ที่นี่การเปลี่ยนเส้นทางใช้open()เพื่อเขียนไฟล์ มีตัวอธิบายไฟล์ Inner (?) ที่สร้างขึ้นในเชลล์แล้วใช้เมื่อจำเป็น descriptor ด้านในถูกสร้างขึ้นตลอดระยะเวลาของสคริปต์หรืออายุการใช้งานเชลล์หรือไม่? มันจะถูกทำลายหลังจากเวลาผ่านไปหลายครั้งหรือหลายครั้งหรือไม่? ฉันหมายถึงโดยเฉพาะอย่างยิ่ง file descriptor สำหรับไฟล์ที่เชลล์ตัวเองเปิดขึ้นสำหรับการทำงานของ builtins สร้าง descriptor และเปิดไฟล์สำหรับการดำเนินการแต่ละครั้งหรือไม่ พวกเขาจะเก็บไว้นานแค่ไหน? ตัวอย่าง: #!/bin/bash >>x echo something ...do many other things not related to the file x >>x echo something more อินสแตนซ์ของ descriptor แรกถูกเก็บไว้จนกว่าการดำเนินการที่สองหรือไม่ แล้วเชลล์ที่ฉันใช้ในเทอร์มินัลล่ะ บางครั้งฉันเปิดเซสชันหนึ่งวันอาจเป็นสัปดาห์ มันยังคงรักษาคำอธิบายสำหรับไฟล์ทั้งหมดที่ฉันดำเนินการกับเชลล์ในตัว?

8
ข้อผิดพลาดกรณีขึ้นอยู่กับเงื่อนไขถ้า
ฉันกำลังมองหาวิธีที่จะมีข้อผิดพลาดเกิดขึ้นตามเงื่อนไข if ภายในเงื่อนไข case ใน bash ตัวอย่างเช่น: input="foo" VAR="1" case $input in foo) if [ $VAR = "1" ]; then # perform fallthrough else # do not perform fallthrough fi ;; *) echo "fallthrough worked!" ;; esac ในรหัสข้างต้นหากตัวแปรVARคือ1ฉันต้องการให้เงื่อนไขกรณีดำเนินการผิดพลาด

2
ทำไม wc <<<“ $ string” แสดงความยาวหนึ่งไบต์นานกว่า printf“ $ string” | ห้องน้ำ?
โดยบังเอิญฉันพบว่าwcนับแตกต่างกันขึ้นอยู่กับว่ามันได้รับข้อมูลจากทุบตี: $ s='hello' $ wc -m &lt;&lt;&lt;"$s" 6 $ wc -c &lt;&lt;&lt;"$s" 6 $ printf '%s' "$s" | wc -m 5 $ printf '%s' "$s" | wc -c 5 นี่คือ - IMHO ทำให้สับสน - พฤติกรรมมีการบันทึกไว้ที่อื่นหรือไม่ สิ่งที่wcนับที่นี่ - นี่คือการขึ้นบรรทัดใหม่หรือไม่

3
รันเชลล์สคริปต์เมื่อ“ / bin / sh” ชี้ไปที่“ / bin / bash”
ฉันได้อ่านสิ่งต่อไปนี้ในคำถามนี้: bash รองรับสวิตช์ --posix ซึ่งทำให้รองรับ POSIX ได้มากขึ้น นอกจากนี้ยังพยายามที่จะเลียนแบบ POSIX ถ้าเรียกว่าเป็นการดวลจุดโทษ อ้างข้างต้นสันนิษฐานว่าคือการเชื่อมโยงที่ชี้ไปยัง/bin/sh/bin/bash แต่ผมไม่เข้าใจสิ่งที่หมายโดย"เรียกว่าเป็นการดวลจุดโทษ" บอกว่าฉันมีสคริปต์ต่อไปนี้ซึ่งเรียกว่า "script.sh": #!/bin/bash echo "Hello World" โปรดบอกฉันในแต่ละกรณีต่อไปนี้ว่าสคริปต์จะทำงานในbashโหมดปกติหรือในโหมด POSIX (สมมติว่าฉันได้ดำเนินการคำสั่งต่อไปนี้ในเทอร์มินัลที่กำลังทำงานอยู่bash): sh script.sh bash script.sh ./script.sh ตอนนี้บอกว่าฉันมีสคริปต์ต่อไปนี้ซึ่งเรียกว่า "script.sh" (ซึ่งเป็นเหมือนสคริปต์ด้านบน แต่ไม่มี Shebang): echo "Hello World" โปรดบอกฉันในแต่ละกรณีต่อไปนี้ว่าสคริปต์จะทำงานในbashโหมดปกติหรือในโหมด POSIX (สมมติว่าฉันได้ดำเนินการคำสั่งต่อไปนี้ในเทอร์มินัลที่กำลังทำงานอยู่bash): sh script2.sh bash script2.sh ./script2.sh
11 linux  bash  shell 

3
อาร์กิวเมนต์บรรทัดคำสั่ง ssh รีโมตรับการวิเคราะห์คำได้อย่างไร
ฉันเห็นคำถามและคำตอบเกี่ยวกับการต้องหลีกเลี่ยงการขัดแย้งกับคำสั่ง ssh จากระยะไกล คำถามของฉันคือ: การแยกวิเคราะห์ครั้งที่สองเสร็จสมบูรณ์เมื่อใดและเมื่อไร ถ้าฉันเรียกใช้ต่อไปนี้: $ ssh otherhost pstree -a -p ฉันเห็นสิ่งต่อไปนี้ในผลลัพธ์: |-sshd,3736 | `-sshd,1102 | `-sshd,1109 | `-pstree,1112 -a -p กระบวนการหลักสำหรับคำสั่งระยะไกล ( pstree) คือsshdไม่ปรากฏว่ามีเปลือกใด ๆ ที่จะแยกวิเคราะห์บรรทัดคำสั่งไปยังคำสั่งระยะไกลดังนั้นมันดูเหมือนว่าจะไม่จำเป็นต้องมีการอ้างถึงหรือหนีสองครั้ง ( แต่มันก็แน่นอน) ถ้าฉันกลับไปที่นั่นก่อนและรับเชลล์ล็อกอินจากนั้นเรียกใช้pstree -a -pฉันจะเห็นสิ่งต่อไปนี้ในผลลัพธ์: ├─sshd,3736 │ └─sshd,3733 │ └─sshd,3735 │ └─bash,3737 │ └─pstree,4130 -a -p เห็นได้ชัดว่ามีbashเชลล์ที่จะทำการแยกบรรทัดคำสั่งในกรณีนั้น แต่ในกรณีที่ฉันใช้คำสั่งระยะไกลโดยตรงดูเหมือนจะไม่เป็นเปลือกดังนั้นทำไมจึงจำเป็นต้องมีการอ้างอิงสองครั้ง
11 bash  shell  ssh  process  quoting 

3
ในเชลล์สคริปต์ฉันจะ (1) เริ่มคำสั่งในพื้นหลังได้อย่างไร (2) รอ x วินาที (3) เรียกใช้คำสั่งที่สองขณะที่คำสั่งนั้นกำลังทำงานอยู่
นี่คือสิ่งที่ฉันต้องเกิดขึ้น: เริ่มกระบวนการ A ในพื้นหลัง รอ x วินาที เริ่มกระบวนการ B ในเบื้องหน้า ฉันจะรอให้เกิดขึ้นได้อย่างไร ฉันเห็นว่า 'หลับ' ดูเหมือนว่าจะหยุดทุกอย่างและฉันไม่ต้องการ 'รอ' เพื่อให้กระบวนการ A สิ้นสุดโดยสิ้นเชิง ฉันเคยเห็นลูปเป็นระยะเวลาหนึ่งแล้ว แต่ฉันสงสัยว่ามีบางอย่างที่สะอาดกว่านี้หรือไม่

2
%% หมายถึงอะไรในชื่อฟังก์ชัน
เมื่อดูที่ผลลัพธ์ของenvฉันพบว่ามีฟังก์ชั่นต่อไปนี้ BASH_FUNC_mc%%=() { . /usr/share/mc/mc-wrapper.sh } เนื้อหาของไฟล์ /usr/share/mc/mc-wrapper.sh มีดังต่อไปนี้ MC_USER=`id | sed 's/[^(]*(//;s/).*//'` MC_PWD_FILE="${TMPDIR-/tmp}/mc-$MC_USER/mc.pwd.$$" /usr/bin/mc -P "$MC_PWD_FILE" "$@" if test -r "$MC_PWD_FILE"; then MC_PWD="`cat "$MC_PWD_FILE"`" if test -n "$MC_PWD" &amp;&amp; test -d "$MC_PWD"; then cd "$MC_PWD" fi unset MC_PWD fi rm -f "$MC_PWD_FILE" unset MC_PWD_FILE สิ่งที่ทำ%%อักขระหมายถึงในชื่อฟังก์ชัน? พวกเขาทำให้มันเป็นฟังก์ชั่นที่เรียกใช้ในกรณีที่เฉพาะเจาะจงหรือพวกเขาอนุญาตให้ฉันเรียกมันแตกต่างจากฟังก์ชั่นอื่น ๆ ? ฉันใช้ …

3
เหตุใดแหล่งที่มา lib / * จึงไม่ทำงาน
ฉันมีโปรแกรมขนาดเล็กซึ่งมีโครงสร้างโฟลเดอร์ต่อไปนี้: - main.sh - lib/ - clean.sh - get.sh - index.sh - test.sh main.shแต่ละไฟล์ที่มีฟังก์ชั่นเดียวที่ผมใช้ใน main.sh: source lib/* get_products clean_products make_index test_index ในสองฟังก์ชันแรกด้านบนทำงานได้ แต่ฟังก์ชันที่สองไม่ทำงาน แต่ถ้าฉันแทนที่source lib/*ด้วย: source lib/get.sh source lib/clean.sh source lib/index.sh source lib/test.sh ทุกอย่างทำงานตามที่คาดไว้ ใครรู้ว่าทำไมsource lib/*ไม่ทำงานตามที่คาดไว้
11 bash  source 

2
Bash: กดหลบหนี 4 ครั้ง
เมื่อฉันกด escape 4 ครั้งในเทอร์มินัล bash มันจะแสดงดังนี้: -bash-4.1$ Display all 2837 possibilities? (y or n) : ! ./ [ [[ ]] { } 411toppm a2p ac accept accton aclocal aclocal-1.11 acpi_listen คุณลักษณะนี้คืออะไรและมีการค้นพบรายการเหล่านี้อย่างไร (ในการกด esc ครั้งที่สองเทอร์มินัลจะส่งเสียงเตือน)
11 bash 


2
มีสูงสุดในการขยายชื่อไฟล์ทุบตี (globbing) และถ้าเป็นเช่นนั้นมันคืออะไร?
มีสูงสุดในการขยายชื่อไฟล์ทุบตี (globbing) และถ้าเป็นเช่นนั้นมันคืออะไร? ดูglobbingใน tldp.org สมมติว่าฉันต้องการเรียกใช้คำสั่งกับชุดย่อยของไฟล์: grep -e bar foo* rm -f bar* มีข้อ จำกัด ว่าจะขยายไฟล์ไปยังจำนวนเท่าใดและถ้าเป็นเช่นนั้นจะเป็นอย่างไร ฉันไม่ได้มองหาวิธีอื่นในการดำเนินการเหล่านั้น (เช่นโดยใช้find)

4
วนซ้ำผ่านไฟล์ที่ไม่รวมไดเรกทอรี
ฉันต้องการสคริปต์ของฉันเพื่อทำบางสิ่งบางอย่างกับทุกไฟล์ในไดเรกทอรีปัจจุบันยกเว้นไดเรกทอรีย่อยใด ๆ ตัวอย่างเช่นในเส้นทางปัจจุบันมี 5 ไฟล์ แต่หนึ่งในนั้นคือโฟลเดอร์ (ไดเรกทอรีย่อย) สคริปต์ของฉันควรเปิดใช้งานคำสั่งที่กำหนดเป็นอาร์กิวเมนต์เมื่อเรียกใช้สคริปต์ดังกล่าว คือ "bash script wc -w" ควรให้จำนวนคำของแต่ละไฟล์ในไดเรกทอรีปัจจุบัน แต่ไม่ใช่โฟลเดอร์ใด ๆ เพื่อให้ผลลัพธ์ไม่เคยมีบรรทัด "/ sub / dir: เป็นไดเรกทอรี" สคริปต์ปัจจุบันของฉัน: #!/bin/bash dir=`pwd` for file in $dir/* do $* $file done ฉันแค่ต้องแยกไดเรกทอรีสำหรับวง แต่ฉันไม่รู้วิธี
11 bash  for 

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