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

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

6
การใช้รหัส“ สงวน” สำหรับสถานะการออกของเชลล์สคริปต์
ฉันเพิ่งเจอรายการรหัสทางออกนี้ด้วยความหมายพิเศษจากคู่มือการใช้สคริปต์การทุบตีขั้นสูง พวกเขาอ้างถึงรหัสเหล่านี้เป็นการสงวนและแนะนำว่า: ตามตารางด้านบนรหัสทางออก 1-2, 126-165 และ 255 มีความหมายพิเศษและควรหลีกเลี่ยงสำหรับพารามิเตอร์ทางออกที่ผู้ใช้ระบุ ไม่นานมานี้ฉันเขียนสคริปต์ซึ่งใช้รหัสสถานะการออกต่อไปนี้: 0 - สำเร็จ 1 - ชื่อโฮสต์ไม่ถูกต้อง 2 - ระบุอาร์กิวเมนต์ที่ไม่ถูกต้อง 3 - สิทธิ์ผู้ใช้ไม่เพียงพอ เมื่อฉันเขียนสคริปต์ฉันไม่ทราบรหัสทางออกพิเศษดังนั้นฉันจึงเริ่มต้นที่ 1 สำหรับเงื่อนไขข้อผิดพลาดแรกและเพิ่มสถานะทางออกสำหรับแต่ละประเภทข้อผิดพลาดต่อเนื่อง ฉันเขียนสคริปต์ด้วยความตั้งใจว่าในเวลาต่อมาสคริปต์อื่น ๆ สามารถเรียกใช้ได้ (ซึ่งสามารถตรวจสอบรหัสทางออกที่ไม่เป็นศูนย์) ฉันยังไม่ได้ทำอย่างนั้นจริง ๆ ; จนถึงตอนนี้ฉันแค่เรียกใช้สคริปต์จากเชลล์เชิงโต้ตอบของฉัน (Bash) และฉันสงสัยว่าจะเกิดอะไรขึ้นหากใช้รหัสทางออกที่กำหนดเอง คำแนะนำจากคู่มือ Bash-Scripting ขั้นสูงมีความเกี่ยวข้อง / สำคัญเพียงใด ฉันไม่พบคำแนะนำการยืนยันใด ๆ ในเอกสาร Bash; ส่วนของมันที่สถานะการออกเพียงแค่แสดงรหัสทางออกที่ใช้โดย Bash แต่ไม่ได้ระบุว่าสิ่งเหล่านี้สงวนไว้หรือเตือนให้ใช้สำหรับสคริปต์ / โปรแกรมของคุณเอง

3
วิธีอ่านไฟล์ dash
ฉันจะอ่านไฟล์เส้นประจากเทอร์มินัลอื่นนอกเหนือจากการลบด้วย ./ ตัวอย่างเช่นการอ่าน- fileเราสามารถอ่านได้โดย cat ./-file_name ถาม:มีวิธีอื่นในการทำสิ่งเดียวกันหรือไม่?
15 bash  cat 

3
วางไข่ - ไม่พบคำสั่ง!
ฉันใช้ Mac OS X 10.9.4 ต่อไปนี้เป็นสคริปต์ของฉันเพื่อคัดลอกไฟล์จากเครื่องท้องถิ่นไปยังโฮสต์อื่น #!/bin/bash #!/usr/bin/expect echo "I will fail if you give junk values!!" echo " " echo "Enter file name: " read filePath echo " " echo "Where you want to copy?" echo "Enter" echo "1. if Host1" echo "2. if Host2" echo "3. if Host3" …

3
`1 >> 'และ' 2 >> 'หมายถึงอะไรในสคริปต์ทุบตี?
ฉันมีสคริปต์ทุบตีต่อไปนี้จากสิ่งที่ฉันเข้าใจ >> ใช้เพื่อผนวกเอาท์พุทของคำสั่งไปยังไฟล์ที่มีอยู่แทนที่จะเขียนทับ แต่สิ่งที่ทำในกรณีนี้คืออะไร สคริปต์นี้กำลังเรียกไฟล์ exe บางไฟล์ให้แปลงจากรูปแบบหนึ่งไปยังอีกรูปแบบหนึ่ง แต่ละไฟล์มีหลายปีดังนั้นมันจึงวนซ้ำแต่ละไฟล์โดยดูที่ชื่อไฟล์ นอกจากนี้เมื่อฉันเรียกใช้สคริปต์นี้ฉันได้รับ "การเปลี่ยนเส้นทางคลุมเครือ" #!/bin/bash source $HOME/.bashrc jobout=${1} joberr=${2} # Set some paths and prefixes yr_bgn=2000 yr_end=2000 yr=${yr_bgn} pth_data='/mnt/' pth_rst='/mnt/' while [ ${yr} -le ${yr_end} ] do ./executable1 ${pth_data}file${yr}-${yr}.nc ${yr} ${pth_rst} 1>> ${jobout} 2>> ${joberr} ./executable2 ${pth_data}file${yr}-${yr}.nc ${yr} ${pth_rst} 1>> ${jobout} 2>> ${joberr} ./executable3 …

5
ฉันจะทดสอบว่ารายการอยู่ในอาร์เรย์ทุบตีได้อย่างไร
ช่วยสคริปต์ง่าย ๆ #!/bin/bash array1=( prova1 prova2 slack64 ) a="slack64" b="ab" if [ $a = $b ] then echo "$a = $b : a is equal to b" else echo "$a = $b: a is not equal to b" fi สคริปต์นี้ใช้งานไม่ได้ฉันต้องการสคริปต์ที่ตรวจสอบว่า slack64 มีอยู่ในรายการ (ฉันใช้อาร์เรย์) และให้ฉันใช่มีอยู่หรือไม่ ฉันไม่รู้วิธีเปรียบเทียบอาเรย์กับตัวแปรตัวเดียว
15 bash  array 

3
ประวัติทุบตีสำหรับเซสชั่นปัจจุบัน
บางทีฉันอาจมองเห็นบางอย่าง แต่มีวิธีรับประวัติทุบตีปัจจุบันของคุณสำหรับเซสชันปัจจุบันที่คุณใช้งานอยู่ ถ้าฉันวิ่ง ssh host $ pwd $ ls $ cd /tmp ฉันแค่อยากเห็น 3 คำสั่งเหล่านั้นและไม่มีอะไรอื่น

2
Bash -c พร้อมพารามิเตอร์ตำแหน่ง
โดยปกติ$0ในสคริปต์จะตั้งชื่อของสคริปต์หรือสิ่งที่มันถูกเรียกว่า (รวมถึงเส้นทาง) อย่างไรก็ตามถ้าฉันใช้bashกับ-cตัวเลือกให้$0ตั้งค่าเป็นอาร์กิวเมนต์แรกที่ส่งผ่านหลังจากสตริงคำสั่ง: bash -c 'echo $0 ' foo bar # foo ผลดูเหมือนว่าพารามิเตอร์ตำแหน่งได้รับการเลื่อน $0แต่รวมถึง อย่างไรก็ตามshiftในสตริงคำสั่งจะไม่ส่งผลกระทบ$0(ตามปกติ): bash -c 'echo $0; shift; echo $0 ' foo bar # foo # foo เหตุใดจึงมีพฤติกรรมแปลก ๆ สำหรับสตริงคำสั่ง โปรดทราบว่าฉันกำลังมองหาเหตุผลเหตุผลที่อยู่เบื้องหลังการใช้พฤติกรรมแปลก ๆ หนึ่งสามารถคาดเดาได้ว่าสตริงคำสั่งดังกล่าวไม่จำเป็นต้องใช้$0พารามิเตอร์ตามปกติที่กำหนดไว้ดังนั้นสำหรับการประหยัดก็ยังใช้สำหรับอาร์กิวเมนต์ปกติ อย่างไรก็ตามในกรณีนั้นพฤติกรรมของshiftคี่ ความเป็นไปได้อีกอย่างหนึ่ง$0คือใช้เพื่อกำหนดพฤติกรรมของโปรแกรม (a la bashเรียกว่าshหรือvimเรียกว่า as vi) แต่ไม่สามารถทำได้เนื่องจาก$0ที่นี่จะเห็นได้เฉพาะในสตริงคำสั่งเท่านั้นและไม่ใช่โดยโปรแกรมที่เรียกว่าภายใน ฉันไม่สามารถคิดถึงการใช้งานอื่น ๆ$0ได้ดังนั้นฉันจึงสูญเสียที่จะอธิบายเรื่องนี้
15 bash 

4
วนซ้ำซ้ำในไฟล์ต่างๆในไดเรกทอรี
วนซ้ำซ้ำในไฟล์ต่างๆในไดเรกทอรีสามารถทำได้อย่างง่ายดายโดย: find . -type f -exec bar {} \; อย่างไรก็ตามข้างต้นไม่สามารถใช้ได้กับสิ่งที่ซับซ้อนมากขึ้นซึ่งต้องมีกิ่งที่มีเงื่อนไขการวนซ้ำ ฯลฯ ต้องทำ ฉันเคยใช้สิ่งนี้สำหรับข้างต้น: while read line; do [...]; done < <(find . -type f) อย่างไรก็ตามดูเหมือนว่าสิ่งนี้จะใช้ไม่ได้กับไฟล์ที่มีอักขระที่ไม่ชัดเจน $ touch $'a\nb' $ find . -type f ./a?b มีทางเลือกอื่นที่จัดการกับตัวละครที่คลุมเครือเช่นนี้หรือไม่

3
วิธีการตั้งค่าจำนวนคำสั่งประวัติการเรียกคืน
ฉันกำลังใช้ทุบตี เพื่อเรียกดูประวัติคำสั่งของฉันฉันกำลังเรียกhistoryคำสั่งที่ฉันเชื่อว่ากำลังเรียกโปรแกรม Gnu ในชื่อเดียวกัน (ฉันไม่รู้ว่ามีวิธีเฉพาะทุบตีที่ดีกว่า) ใน. bashrc ของฉันฉันมีบรรทัดที่export PROMPT_COMMAND='history -a'จะเก็บประวัติจากเซสชันทุบตีหลายครั้งที่ฉันใช้อยู่ ถ้าฉันทำประวัติฉันเห็น 524 รายการในปัจจุบันเท่านั้น สามารถกำหนดค่านี้ได้หรือไม่ ฉันต้องการที่จะเพิ่มจำนวนนี้เป็นจำนวนมากขึ้นกล่าวว่า 2000

5
เรียกใช้คำสั่งเมื่อระบบไม่ได้ใช้งานและเมื่อใช้งานอีกครั้ง
ฉันต้องการเรียกใช้คำสั่งเมื่อผู้ใช้ไม่ได้ใช้งาน (ระบบไม่ได้ใช้งาน) ตัวอย่างเช่น: echo "You started to be inactive." นอกจากนี้เมื่อผู้ใช้กลับมาใช้งานอีกครั้ง (ระบบจะไม่ได้ใช้งานอีกต่อไป): echo "You started to be active, again." ฉันต้องการเชลล์สคริปต์ที่จะทำสิ่งนี้ สิ่งนี้เป็นไปได้หรือไม่ อาจจะมีเหตุการณ์ระบบบางอย่าง?
15 linux  bash  shell 


1
ดำเนินการคำสั่งที่จัดทำโดยพารามิเตอร์ฟังก์ชัน
ฉันพยายามที่จะสร้างวิธีการฟังก์ชั่นในสคริปต์ทุบตีที่ดำเนินการคำสั่งซึ่งให้กับวิธีการโดยพารามิเตอร์ ความหมายบางอย่างเช่นนี้: special_execute() { # Some code # Here's the point where the command gets executed $@ # More code } special_execute echo "abc" ฉันพยายามแล้วผม$@, "$@", $*, "$*"วิธีการที่ฉันจะทำเช่นนั้น?

3
เมื่อใดที่จะใช้การเปลี่ยนเส้นทางไปยัง stderr ในเชลล์สคริปต์
ฉันรู้ว่าโปรแกรมอรรถประโยชน์ที่ทำงานได้ดีเช่นข้อความgrep "ปกติ" ไปยัง stdout และข้อความแสดงข้อผิดพลาดไปยัง stderr $ grep '^foo' file1 file2 file1:foo grep: file2: No such file or directory เมื่อฉันเขียนเชลล์สคริปท์ตัวเองฉันมักจะพบว่ามันยากที่จะตัดสินใจว่าเอาต์พุตใดและข้อความใดที่ฉันควรแสดงบน stderr หรือถ้าฉันควรจะใส่ใจ ฉันต้องการทราบเกี่ยวกับแนวปฏิบัติที่ดี: เมื่อใดที่มีการเปลี่ยนเส้นทางข้อความไปยัง stderr ที่ถูกเรียกร้องและสมเหตุสมผลและเมื่อใด "ขึ้นอยู่กับ" แน่นอน แต่คุณมีความเข้าใจที่จะช่วยฉันตัดสินใจเหล่านี้หรือไม่ เพื่อให้คำถามอัตนัยนี้สอดคล้องกับรูปแบบฉันต้องการสนับสนุนคำตอบที่ตอบว่า "ทำไม" และได้รับการแจ้งจากประสบการณ์และหากได้รับการสนับสนุนจากข้อเท็จจริง

4
ชักหรือโต้ตอบ
ฉันจะสร้างสคริปต์ที่จะใช้อินพุตของผู้ใช้ดังนั้นฉันตัดสินใจที่จะใช้แส้ แต่ก็สับสนนิดหน่อยว่าอันไหนที่พกพาได้และจะทำงานใน ubuntu 10.x และสูงกว่าและ CentOs5.x ขึ้นไป ฉันรู้readแต่ฉันต้องการไดอะล็อกเหมือนเครื่องมือดังนั้นถ้าใครรู้ทางเลือกอื่นก็แค่บอกให้ฉันรู้

7
วิธีคัดลอกทุกไฟล์ที่ 4 ในโฟลเดอร์
00802_Bla_Aquarium_XXXXX.jpgฉันมีจำนวนมากของไฟล์ในโฟลเดอร์ที่ชื่อเหมือน ตอนนี้ผมต้องคัดลอกทุก4selected/ไฟล์ไปยังโฟลเดอร์ย่อยพูดใน 00802_Bla_Aquarium_00020.jpg <= this one 00802_Bla_Aquarium_00021.jpg 00802_Bla_Aquarium_00022.jpg 00802_Bla_Aquarium_00023.jpg 00802_Bla_Aquarium_00024.jpg <= this one 00802_Bla_Aquarium_00025.jpg 00802_Bla_Aquarium_00026.jpg 00802_Bla_Aquarium_00027.jpg 00802_Bla_Aquarium_00028.jpg <= this one 00802_Bla_Aquarium_00029.jpg ฉันจะทำสิ่งนี้ได้อย่างไร
15 bash  files  cp 

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