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

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

2
ใช้คำสั่ง `select 'เพื่อพิมพ์เมนูใน Bash
ฉันพยายามใช้เมนูอย่างง่ายโดยใช้selectคำสั่ง สคริปต์ (สำหรับจุดประสงค์ในการทดสอบ) มีดังนี้: #!/bin/bash echo "*******************" PS3='Select an option and press Enter: ' options=("apache" "named" "sendmail") select opt in "${options[@]}" do case $opt in "apache") date ;; "named") echo "test" ;; "sendmail") echo "test 2" ;; *) echo "invalid option";; esac done echo "*********************" สคริปต์ไม่รู้จักอินพุตที่ถูกต้องที่ฉันให้และพิมพ์ข้อความ "ตัวเลือกที่ไม่ถูกต้อง" เสมอ เกิดอะไรขึ้นในสคริปต์นี้

2
วิธีการขัดขวางไม่ให้รูทสคริปต์ทำงาน
Glassfishแอพพลิเคชันเซิร์ฟเวอร์ให้สคริปต์เพื่อดูแลเซิร์ฟเวอร์แอพลิเคชันและยังเริ่มต้นและหยุดพวกเขาและฉันต้องการที่จะ จำกัด การใช้รากจากการทำงานสคริปต์นี้ เหตุผลก็คือผู้พัฒนาคีย์บางคนลืมจัดการเซิร์ฟเวอร์ในฐานะผู้ใช้ที่ไม่ได้รับสิทธิพิเศษและหากพวกเขารีสตาร์ทเซิร์ฟเวอร์แอปพลิเคชันในฐานะผู้ใช้รูทดังนั้นแอปพลิเคชันเซิร์ฟเวอร์จะต้องดำเนินการโดยผู้ใช้รูท มันไม่ใช่ตัวเลือกในการหลีกเลี่ยงการให้สิทธิ์การเข้าถึงรูทและนักพัฒนาซอฟต์แวร์ลืมเพราะพวกเขาคุ้นเคยกับการทำเช่นนี้ในเครื่องของพวกเขา ฉันต้องการให้asadminสคริปต์เปลี่ยนให้ทำงานในฐานะผู้ใช้ที่ไม่มีสิทธิพิเศษหรือเลือกแสดงข้อความแสดงข้อผิดพลาดทุกครั้งที่สคริปต์ทำงานโดยรูท ใช้ Bash shell [*]: ฉันพยายามแก้ไขสิทธิ์ในไฟล์ แต่ถึงแม้ว่าฉันจะติดตามไฟล์จำนวนมากที่รูทเป็นเจ้าของและ chmod พวกเขาแอปพลิเคชันพบข้อผิดพลาดแปลก ๆ และฉันต้องทำงานเป็นรูทอีกครั้ง

3
bash: cd ไปยังไดเร็กทอรีย่อยที่แก้ไขล่าสุด
สงสัยว่ามีวิธีที่ง่ายและ / หรือพกพาในการพูดว่า "เปลี่ยนเป็นไดเรกทอรีย่อยที่แก้ไขล่าสุด" ฉันสามารถใช้ ls และ awk แต่อาจมีวิธีที่ดีกว่า cd $( ls -ltrd */ | tail -1 | awk '{ print $8 }' ) ฉันต้องเรียกใช้คำสั่งในไดเรกทอรี "ไฟล์เอาต์พุต" ที่มีไดเรกทอรีย่อยหลายร้อยรายการและ 99% ของเวลาที่ฉันต้องการไปยังไดเรกทอรีที่เปลี่ยนแปลงล่าสุด ฉันไม่รู้ว่าชื่อของไดเรกทอรีจะเป็นอะไรล่วงหน้า
10 bash  date  cd-command 

2
มีวิธีที่ถูกต้องในการแสดงรายการไดเรกทอรีย่อยของไดเรกทอรีปัจจุบันหรือไม่?
ฉันสามารถค้นหาไดเรกทอรีย่อยของไดเรกทอรีโดย ls -d -- */ หรือ ls -l | grep "^d" แต่ทั้งคู่ดูเหมือนจะเป็นทางอ้อมและฉันคิดว่าจะมีวิธีมาตรฐานในการค้นหาเฉพาะไดเรกทอรี มีวิธีที่ถูกต้องในการทำเช่นนี้? และถ้าไม่เช่นนั้นสิ่งเหล่านี้จะนำไปสู่พฤติกรรมที่ไม่พึงประสงค์ในคดีขอบหรือไม่? (ลิงก์สัญลักษณ์ไดเรกทอรีที่ซ่อนอยู่ ฯลฯ )

1
coreutils gnu เรียงลำดับแตกหรือไม่
พิจารณาอินพุตต่อไปนี้เพื่อจัดเรียง: cat > foo <<EOM D,,5014978 DD,,25 D,I,1972765530 D,Y,4223624 -,Y,71285059 YA,I,2 EOM ตอนนี้ลองเรียกใช้ sort foo ผลลัพธ์ไม่ถูกจัดเรียงเมื่อพยายามทำสิ่งนี้บนกล่อง linux ของฉัน (gnu coreutils รุ่น 6.9-7.4) เอาต์พุตถูกเรียงลำดับเมื่อรันภายใต้ cygwin (gnu coretuils 8.5) ความคิดเห็น?
10 bash  coreutils  sort 

2
กำลังเตรียมใช้งานตัวแปร Bash - จำเป็นต้องมีการแนะนำหรือกำหนดตามที่คุณไป
มีข้อได้เปรียบ / เสียเปรียบในการเตรียมใช้งานค่าของตัวแปร bash ในสคริปต์ไม่ว่าจะก่อนโค้ดหลักหรือตัวแปรโลคัลในฟังก์ชันก่อนกำหนดค่าจริงให้กับมัน? ฉันต้องทำอะไรแบบนี้หรือเปล่า: init() { name="" name=$1 } init "Mark" มีความเสี่ยงของตัวแปรที่เริ่มต้นด้วยค่าขยะ (หากไม่ได้กำหนดค่าเริ่มต้น) และมีผลกระทบเชิงลบของค่าของตัวแปรหรือไม่?
9 bash  variable 

3
ตัวบ่งชี้โทเค็นของ `]` คืออะไร?
คู่มือทุบตีพูดว่า: เมื่อใช้ [แบบฟอร์มอาร์กิวเมนต์สุดท้ายของคำสั่งจะต้องเป็น] $ type [ [ is a shell builtin $ type ] bash: type: ]: not found ดังนั้นจึง]ไม่ใช่คำที่สงวนไว้และไม่เป็นตัวดำเนินการหรือเป็นคำสั่งในตัว ในฐานะโทเค็นตัวระบุโทเค็น]คืออะไร คำหรือชื่อ?
9 bash 

2
วิธีการวนซ้ำ 3 ครั้งในสคริปต์ทุบตีเมื่อนักเทียบท่าดันล้มเหลว?
ฉันมีสคริปต์ทุบตีซึ่งเพียงนักเทียบท่าดันภาพ: docker push $CONTAINER_IMAGE:latest ฉันต้องการวนซ้ำ 3 ครั้งเมื่อสิ่งนี้ล้มเหลว ฉันจะทำสิ่งนี้ได้อย่างไร

5
วิธีการคัดลอกไฟล์ทำธุรกรรม?
ฉันต้องการคัดลอกไฟล์จาก A ถึง B ซึ่งอาจอยู่ในระบบไฟล์ที่แตกต่างกัน มีข้อกำหนดเพิ่มเติมบางประการ: การคัดลอกนั้นมีทั้งหมดหรือไม่มีไฟล์ไม่มีไฟล์ B บางส่วนหรือเสียหายที่เกิดความผิดพลาด อย่าเขียนทับไฟล์ที่มีอยู่ B; อย่าแข่งขันกับการดำเนินการพร้อมกันของคำสั่งเดียวกันอย่างมากหนึ่งสามารถประสบความสำเร็จ ฉันคิดว่านี่เข้าใกล้: cp A B.part && \ ln B B.part && \ rm B.part แต่ 3. ถูกละเมิดโดย cp จะไม่ล้มเหลวหาก B.part มีอยู่ (แม้จะมีแฟล็ก -n) ต่อมา 1. อาจล้มเหลวหากกระบวนการอื่น 'ชนะ' cp และไฟล์ที่ลิงก์เข้าที่ไม่สมบูรณ์ B.part อาจเป็นไฟล์ที่ไม่เกี่ยวข้อง แต่ฉันยินดีที่จะล้มเหลวโดยไม่ลองใช้ชื่ออื่นที่ซ่อนอยู่ในกรณีนั้น ฉันคิดว่า bash noclobber ช่วยได้ทำงานได้อย่างสมบูรณ์หรือไม่ มีวิธีรับโดยไม่มีข้อกำหนดรุ่น bash หรือไม่ …
9 linux  bash  cp 

4
ประสิทธิภาพของลูปเทียบกับการขยาย
ต้องการคำแนะนำจากผู้เชี่ยวชาญในการเปรียบเทียบด้านล่าง: ส่วนของรหัสโดยใช้ลูป: for file in `cat large_file_list` do gzip -d $file done ส่วนของรหัสโดยใช้การขยายอย่างง่าย: gzip -d `cat large_file_list` อันไหนจะเร็วกว่ากัน? ต้องจัดการกับชุดข้อมูลขนาดใหญ่

6
จัดเตรียมบรรทัดสุดท้ายของ stdin ไปยัง stdin ทั้งหมด
พิจารณาสคริปต์นี้: tmpfile=$(mktemp) cat <<EOS > "$tmpfile" line 1 line 2 line 3 EOS cat <(tail -1 "$tmpfile") "$tmpfile" งานและผลลัพธ์: line 3 line 1 line 2 line 3 สมมติว่าแหล่งอินพุตของเราแทนที่จะเป็นไฟล์จริงแทน stdin: cat <<EOS | # what goes here now? line 1 line 2 line 3 EOS เราจะแก้ไขคำสั่งได้อย่างไร: cat <(tail -1 "$tmpfile") "$tmpfile" …
9 bash 

1
ทำไมเครื่องหมายตัวหนอน (~) ไม่ขยายเมื่อใช้กับอาร์กิวเมนต์ CLI ที่ขึ้นต้นด้วยขีดกลาง
ฉันเสียเวลาสองสามชั่วโมงในการพยายามเรียกใช้เซิร์ฟเวอร์ VNC (x0vncserver) และลูกค้าปฏิเสธที่จะเชื่อมต่อกับข้อความแปลก ๆ ที่ No password configured for VNC Auth เซิร์ฟเวอร์ยังพิมพ์ข้อผิดพลาดนี้ SVncAuth: opening password file '~/.vnc/passwd' failed ตกลงฉันเสียเวลามากจนกว่าฉันจะรู้ว่าตัวหนอนไม่ได้ถูกขยายโดยเชลล์หรือโดย x0vncserver จากนั้นฉันก็ทำการทดสอบเหล่านี้ $ echo --PasswordFile=~/.vnc/passwd --PasswordFile=~/.vnc/passwd แต่ $ echo PasswordFile=~/.vnc/passwd PasswordFile=/home/tichomir/.vnc/passwd ทำไมถึงเป็นอย่างนั้น? ทำไมเชลล์ปฏิเสธที่จะขยายตัวหนอนถ้าอาร์กิวเมนต์เริ่มต้นด้วยเส้นประ? ฉันคิดว่าตัวหนอนจะขยายตราบใดที่มันไม่ได้ยกมา แต่เห็นได้ชัดว่ามีกฎอื่นที่เข้ามาเล่น?
9 bash  shell  tilde 

3
ฉันจะป้องกันไม่ให้ตัวเลือก 'shopt' ไม่สนับสนุนการทำให้เกิดข้อผิดพลาดใน. bashrc ของฉันได้อย่างไร
ฉันทำงานในสภาพแวดล้อมที่ค่อนข้างหลากหลายซึ่งฉันอาจใช้ Bash รุ่นต่างๆในโหนด HPC, VM หรือเวิร์กสเตชันส่วนตัวของฉัน เนื่องจากฉันใส่สคริปต์การเข้าสู่ระบบใน repo Git ฉันต้องการใช้ (ish) เดียวกัน.bashrcทั่วกระดานโดยไม่ต้อง "ถ้าโฮสต์นี้แล้ว ... " - ประเภทความยุ่งเหยิง ผมชอบการทำงานเริ่มต้นของการทุบตี≤ 4.1 ที่ขยายcd $SOMEPATHเข้าไปในcd /the/actual/pathเมื่อกดTabคีย์ ในทุบตี 4.2 และสูงกว่าที่คุณจะต้องshopt -s direxpandเปิดใช้งานลักษณะการทำงานนี้และที่ไม่ได้เป็นใช้ได้จนกว่า 4.2.29 นี่เป็นเพียงตัวอย่างเดียว shoptตัวเลือกอื่นที่เกี่ยวข้องอาจเป็นไปได้complete_fullquote(แม้ว่าฉันไม่ทราบว่าสิ่งที่มันทำ) อาจมีการเปลี่ยนแปลงพฤติกรรมเริ่มต้นที่ v4.2 แต่direxpandไม่ได้รับการยอมรับจากรุ่นก่อนหน้าทุบตีและถ้าผมพยายามที่จะshopt -s direxpandอยู่ในของฉัน.bashrcที่ส่งผลให้เกิดข้อผิดพลาดถูกพิมพ์ไปยังคอนโซลครั้งที่ผมเข้าสู่โหนดกับเก่าทุบตีทุก: -bash: shopt: direxpand: invalid shell option name สิ่งที่ฉันต้องการจะทำคือล้อมรอบเงื่อนไขshop -s direxpandเพื่อเปิดใช้งานตัวเลือกนั้นใน Bash> 4.1 อย่างแข็งแกร่งโดยไม่ต้อง chashing เวอร์ชันเก่าของ …

3
“ แปรปรวน” เครื่องหมายและ (พื้นหลังกระบวนการ)
ฉันต้องการทราบว่ามีวิธีที่จะใส่เครื่องหมายและในตัวแปรและยังใช้เพื่อส่งกระบวนการไปยังพื้นหลัง งานนี้: BCKGRND=yes if [ "$BCKGRND" = "yes" ]; then sleep 5 & else sleep 5 fi แต่มันจะไม่เจ๋งมั้ยที่จะบรรลุห้าสายเหล่านั้นด้วยเพียงอันเดียว? ชอบมาก BCKGRND='&' sleep 5 ${BCKGRND} แต่นั่นไม่ได้ผล หาก BCKGRND ไม่ได้ตั้งค่าให้ใช้งานได้ แต่เมื่อตั้งค่ามันจะตีความว่าเป็นตัวอักษร '&' และข้อผิดพลาด

2
bash: echo: ข้อผิดพลาดในการเขียน: การเรียกระบบขัดจังหวะ
ฉันต้องการสร้างรายการที่เรียงลำดับด้วยตัวเลข 8 หลักทั้งหมด - จาก 00000000 ถึง 99999999 ฉันพิมพ์ในเชลล์: f() { while IFS="" read -r line; do for i in {0..9}; do echo "$line$i"; done; done } echo | f | f | f | f | f | f | f | f | tee result.txt | wc -l …
9 bash 

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