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

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

3
โปรแกรมสามารถเขียนด้วย Bash บริสุทธิ์ได้อย่างไร [ปิด]
ปิด คำถามนี้เป็นคำถามความคิดเห็นตาม ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้สามารถตอบข้อเท็จจริงและการอ้างอิงได้โดยแก้ไขโพสต์นี้ ปิดให้บริการใน3 ปีที่ผ่านมา หลังจากที่บางวิจัยอย่างรวดเร็วมากดูเหมือนทุบตีเป็นภาษาทัวริงสมบูรณ์ ฉันสงสัยว่าเพราะเหตุใด Bash จึงใช้สคริปต์เกือบทั้งหมดเพื่อเขียนสคริปต์ที่ค่อนข้างง่าย เนื่องจาก Bash shell มาพร้อมกับ Linux คุณสามารถเรียกใช้เชลล์สคริปต์ได้โดยไม่ต้องมีตัวแปลหรือคอมไพเลอร์ภายนอกตามที่จำเป็นสำหรับภาษาคอมพิวเตอร์ที่เป็นที่นิยมอื่น ๆ นี่เป็นข้อได้เปรียบที่ยิ่งใหญ่ที่สามารถชดเชยความธรรมดาของภาษาในบางกรณี ดังนั้นจึงมีข้อ จำกัด ว่าโปรแกรมดังกล่าวจะซับซ้อนแค่ไหน? Pure Bash ใช้ในการเขียนโปรแกรมที่ซับซ้อนหรือไม่? เป็นไปได้ที่จะเขียน, พูด, ไฟล์คอมเพรสเซอร์ / decompressor ใน Bash บริสุทธิ์? คอมไพเลอร์? วิดีโอเกมง่ายๆ? มันใช้อย่างเบาบางเพียงเพราะมีเครื่องมือดีบั๊กที่ จำกัด เท่านั้นใช่ไหม

1
วนซ้ำกับสตริงหลายบรรทัดที่เก็บอยู่ในตัวแปร
ฉันอ่านว่ามันไม่ดีที่จะเขียนสิ่งต่าง ๆ เช่นfor line in $(command)วิธีที่ถูกต้องดูเหมือนจะเป็นแทน: command | while IFS= read -r line; do echo $line; done มันใช้งานได้ดี แต่ถ้าสิ่งที่ฉันต้องการทำซ้ำคือเนื้อหาของตัวแปรไม่ใช่ผลลัพธ์โดยตรงของคำสั่ง ตัวอย่างเช่นสมมติว่าคุณสร้างไฟล์ต่อไปนี้quickfox: The quick brown foxjumps\ over - the lazy , dog. ฉันอยากทำสิ่งนี้: # This is just for the example, # I could of course stream the contents to `read` variable=$(cat quickfox); …
17 bash  read 

2
ค้นหาไฟล์ที่ใหม่กว่า 15 วินาที แต่เก่ากว่า 2 วินาที
ฉันต้องการค้นหาไฟล์ที่ใหม่กว่า 15 วินาที แต่เก่ากว่า 2 วินาที นี่คือสคริปต์ที่ฉันใช้ในขณะนี้ซึ่งคว้าไฟล์ใหม่กว่า 15 วินาที: find /my/directory -name '*.jpg' -not -newermt '-15 seconds' ความช่วยเหลือใด ๆ ที่ชื่นชมอย่างมาก
17 bash  find 

4
ฉันจะใช้ตัวแปรเป็นเงื่อนไขเคสได้อย่างไร?
ฉันพยายามที่จะใช้ตัวแปรประกอบด้วยสตริงที่แตกต่างกันแยกออกจากกันด้วยความ|เป็นcaseทดสอบคำสั่ง ตัวอย่างเช่น: string="\"foo\"|\"bar\"" read choice case $choice in $string) echo "You chose $choice";; *) echo "Bad choice!";; esac ฉันต้องการที่จะพิมพ์fooหรือbarดำเนินการส่วนแรกของcaseคำสั่ง อย่างไรก็ตามทั้งสองfooและbarพาฉันไปที่สอง: $ foo.sh foo Bad choice! $ foo.sh bar Bad choice! ใช้"$string"แทน$stringทำให้ไม่มีความแตกต่าง string="foo|bar"ไม่ไม่ใช้ ฉันรู้ว่าฉันสามารถทำได้ด้วยวิธีนี้: case $choice in "foo"|"bar") echo "You chose $choice";; *) echo "Bad choice!";; esac ฉันสามารถคิดถึงวิธีแก้ปัญหาต่าง ๆ แต่ฉันต้องการทราบว่าเป็นไปได้ที่จะใช้ตัวแปรเป็นcaseเงื่อนไขในการทุบตี เป็นไปได้และถ้าเป็นเช่นนั้นได้อย่างไร

5
สำรวจไดเรกทอรีย่อยทั้งหมดในและทำบางสิ่งใน Unix shell script
ฉันต้องการเชลล์สคริปต์ของฉันเพื่อเยี่ยมชมไดเรกทอรีย่อยทั้งหมดในไดเรกทอรีหลัก ทำบางสิ่งในไดเรกทอรีส่งออกไปยังไฟล์สปูลและย้ายไปยังไดเรกทอรีถัดไป พิจารณา Dir หลัก = / tmp Sub Dir = ABCD (ไดเรกทอรีย่อยสี่แห่ง)

3
อะไรคือความแตกต่างระหว่าง“ eval” และ“ source / dev / stdin”?
ระหว่างทางเลือกต่อไปนี้ ... evalกับ comd="ls" eval "$comd" กับ source /dev/stdin printf "ls" | source /dev/stdin ด้วยsource /dev/stdinและ( )หรือ{ } ( printf "ls" ) | source /dev/stdin { printf "ls"; } | source /dev/stdin (เมื่อเราทำงานprintfใน{ }จะมีผลประโยชน์อื่น ๆ กว่าไม่ได้ใช้ subshell ใด ๆ ?) ความแตกต่างระหว่างพวกเขาคืออะไร? ข้อไหนดี? วิธีใดในการรันคำสั่งที่ต้องการ ()หรือ{}?

9
ฟังก์ชั่นทุบตีที่รับอาร์กิวเมนต์เหมือนภาษาอื่นหรือไม่?
ฉันมีฟังก์ชั่นทุบตีเพื่อตั้งค่า$PATHเช่นนี้ - assign-path() { str=$1 # if the $PATH is empty, assign it directly. if [ -z $PATH ]; then PATH=$str; # if the $PATH does not contain the substring, append it with ':'. elif [[ $PATH != *$str* ]]; then PATH=$PATH:$str; fi } แต่ปัญหาคือฉันต้องเขียนฟังก์ชั่นที่แตกต่างกันสำหรับตัวแปรที่แตกต่างกัน (ตัวอย่างเช่นฟังก์ชั่นอื่นสำหรับ$CLASSPATHชอบassign-classpath()ฯลฯ ) ฉันไม่สามารถหาวิธีส่งอาร์กิวเมนต์ไปยังฟังก์ชัน bash เพื่อให้สามารถเข้าถึงได้โดยการอ้างอิง …
17 bash  bash-script 

6
วิธีการส่งออกสตริงที่คั่นด้วยเครื่องหมายจุลภาคโดยใช้การขยาย bash brace
ฉันต้องการ $ echo a{b,c,d} เพื่อส่งออกรายการคั่นด้วยเครื่องหมายจุลภาคเช่น ab,ac,ad แทนการส่งออกปกติ ab ac ad วิธีที่ง่ายที่สุดในการทำเช่นนั้นในบรรทัดคำสั่งคืออะไร?
17 bash  shell 

2
วิธีรับชื่อเทอร์มินัลปัจจุบัน
ฉันจะดึงชื่อเทอร์มินัลปัจจุบันได้อย่างไร ฉันหมายถึงชื่อที่psแสดงในคอลัมน์ TTY เช่น: root@dor-desktop:/home/dor/Documents/LAMP_setup/webs_install/do/install# ps aux | egrep 'mysql|(^USER)' USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND dor 2238 0.2 1.9 448052 79796 ? S 17:27 0:17 gedit /home/dor/Documents/LAMP_setup/webs_install/do/install/mysql.install /home/dor/Documents/LAMP_setup/webs_install/do/install/mysql.setup root 4975 0.1 0.5 324984 22876 ? S 18:12 0:04 gedit /usr/local/mysql/bin/mysqld_safe root 8160 0.0 0.0 …
17 bash  terminal 

1
รูปแบบทั่วไปของชื่อคีย์สำหรับการผูกคีย์ในไฟล์“ inputrc” คืออะไร?
ฉันเข้าใจว่ารูปแบบสำหรับการเชื่อมโยงคีย์ในinputrcไฟล์คือ: keyname: function-name or macro สำหรับชื่อคีย์ฉันเห็นสิ่งต่าง ๆ เช่น: "\e[B" "\e[1~" "\e[5D" "\M-l" "\C-[OD" "\e\e[D" ความหมายของชื่อคีย์เหล่านี้คืออะไรและรูปแบบทั่วไปของชื่อคีย์คืออะไร โปรดแบ่งปันลิงก์ไปยังเอกสาร
17 bash  readline 

4
find-command สำหรับไดเร็กทอรีย่อยที่แน่นอน
สมมติว่าผมมีไดเรกทอรีdirที่มีสามไดเรกทอรีย่อย..dir1 dir3และข้างในฉันมีไฟล์มากมายและไดเรกทอรีย่อยอื่น ๆ ฉันต้องการค้นหาไฟล์ข้างในพูดด้วย*.cจุดจบ แต่ฉันต้องการค้นหาเฉพาะในไดเรกทอรีย่อย "dir / dir2" และไดเรกทอรีย่อยทั้งหมด ฉันจะกำหนดสิ่งนั้นได้อย่างไร สมมติว่าdir/ฉันมีฉัน: find . -name "*.c" เพื่อค้นหาในทุกไดเรกทอรี ฉันจะ จำกัด เฉพาะได้dir2อย่างไร
17 linux  bash  shell  find 

5
การเชื่อมโยงอาเรย์ของ BASH
มีวิธีพิมพ์อาร์เรย์ทั้งหมด ([คีย์] = ค่า) โดยไม่วนรอบองค์ประกอบทั้งหมดหรือไม่ สมมติว่าฉันได้สร้างอาร์เรย์ที่มีองค์ประกอบบางอย่าง: declare -A array array=([a1]=1 [a2]=2 ... [b1]=bbb ... [f500]=abcdef) ฉันสามารถพิมพ์อาเรย์ทั้งหมดด้วย for i in "${!array[@]}" do echo "${i}=${array[$i]}" done อย่างไรก็ตามดูเหมือนว่าทุบตีรู้วิธีการรับองค์ประกอบอาร์เรย์ทั้งหมดใน "ไป" - คีย์ทั้งสอง ${!array[@]}${array[@]}และค่านิยม มีวิธีในการทุบตีพิมพ์ข้อมูลนี้โดยไม่วนซ้ำหรือไม่? แก้ไข: typeset -p arrayทำอย่างนั้น! อย่างไรก็ตามฉันไม่สามารถลบทั้งคำนำหน้าและคำต่อท้ายในการทดแทนเดียว: a="$(typeset -p array)" b="${a##*(}" c="${b%% )*}" มีวิธีที่สะอาดกว่าในการรับ / พิมพ์เฉพาะส่วน key = value ของเอาต์พุตหรือไม่?

2
นามแฝงและฟังก์ชั่น
จากคู่มือทุบตี กฎที่เกี่ยวข้องกับคำจำกัดความและการใช้นามแฝงค่อนข้างสับสน Bash จะอ่านบรรทัดที่สมบูรณ์อย่างน้อยหนึ่งรายการก่อนดำเนินการคำสั่งใด ๆ ในบรรทัดนั้น นามแฝงจะถูกขยายเมื่อคำสั่งถูกอ่านไม่ใช่เมื่อถูกเรียกใช้งาน ดังนั้นคำนิยามนามแฝงที่ปรากฏบนบรรทัดเดียวกันกับคำสั่งอื่นจะไม่มีผลจนกว่าจะอ่านบรรทัดอินพุตถัดไป คำสั่งที่ตามหลังนิยาม alias บนบรรทัดนั้นจะไม่ได้รับผลกระทบจาก alias ใหม่ ลักษณะการทำงานนี้ยังเป็นปัญหาเมื่อใช้งานฟังก์ชัน นามแฝงจะถูกขยายเมื่อคำจำกัดความฟังก์ชั่นการอ่านไม่ได้เมื่อฟังก์ชั่นการดำเนินการเพราะคำนิยามฟังก์ชั่นเป็นตัวเองคำสั่งผสม เป็นผลให้, นามแฝงที่กำหนดในฟังก์ชั่นจะไม่สามารถใช้งานได้จนกว่าจะมีการใช้งานฟังก์ชันดังกล่าว เพื่อความปลอดภัยให้ใส่คำจำกัดความของนามแฝงบนบรรทัดแยกต่างหากเสมอและห้ามใช้นามแฝงในคำสั่งผสม ประโยคสองประโยค "นามแฝงถูกขยายเมื่อนิยามฟังก์ชันถูกอ่านไม่ใช่เมื่อเรียกใช้ฟังก์ชัน" และ "นามแฝงที่กำหนดในฟังก์ชันไม่พร้อมใช้งานจนกว่าหลังจากฟังก์ชันนั้นถูกเรียกใช้งาน" ดูเหมือนจะขัดแย้งกัน คุณสามารถอธิบายสิ่งที่พวกเขาหมายถึงตามลำดับ?
17 bash  alias  function 

2
แหล่งที่มากับ ทำไมพฤติกรรมที่แตกต่างกันอย่างไร
ฉันเพิ่งเรียนรู้ว่า . ./.a.aและ./.a.aเหมือนกัน อย่างไรก็ตามการพยายามsource source .a.aให้ข้อผิดพลาด IMO .การเป็นคนทุบตีแทนsourceไม่ควรทำตัวแตกต่างดังนั้นฉันจะพลาดอะไรไป? โบนัสทำไม. .ตกลงในขณะที่source sourceไม่?
17 bash 

3
วิธีการจัดรูปแบบเลขทศนิยมด้วยเลข 2 ตัวที่สำคัญในการทุบตี?
ฉันต้องการพิมพ์เลขทศนิยมด้วยเลขนัยสำคัญสองตัวใน bash (อาจใช้เครื่องมือทั่วไปเช่น awk, bc, dc, perl และอื่น ๆ ) ตัวอย่าง: ควรพิมพ์ 76543 เป็น 76000 0.0076543 ควรพิมพ์เป็น 0.0076 ในทั้งสองกรณีตัวเลขที่สำคัญคือ 7 และ 6 ฉันได้อ่านคำตอบสำหรับปัญหาที่คล้ายกันเช่น: วิธีการปัดเลขทศนิยมในเปลือก? Bash จำกัดความแม่นยำของตัวแปร floating point แต่คำตอบจะเน้นที่การ จำกัด จำนวนตำแหน่งทศนิยม (เช่นbcคำสั่งด้วยscale=2หรือprintfคำสั่งด้วย%.2f) แทนตัวเลขที่มีนัยสำคัญ มีวิธีที่ง่ายในการจัดรูปแบบตัวเลขด้วยตัวเลข 2 ตัวที่สำคัญหรือฉันต้องเขียนฟังก์ชั่นของตัวเองหรือไม่?
17 bash  awk  bc  floating-point  dc 

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