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

สำหรับคำถามเกี่ยวกับสคริปต์ที่เขียนขึ้นสำหรับเชลล์คำสั่ง Bash สำหรับเชลล์สคริปต์ที่มีข้อผิดพลาด / ข้อผิดพลาดทางไวยากรณ์โปรดตรวจสอบด้วยโปรแกรม shellcheck (หรือในเซิร์ฟเวอร์ shellcheck เว็บที่ https://shellcheck.net) ก่อนโพสต์ที่นี่ คำถามเกี่ยวกับการใช้งานอินเทอร์แอคทีฟของ Bash นั้นมีแนวโน้มที่จะอยู่ในหัวข้อของผู้ใช้ขั้นสูงมากกว่าในสแต็คโอเวอร์โฟลว์

2
ความสับสนเกี่ยวกับ $ {array [*]} เทียบกับ $ {array [@]} ในบริบทของการทำ bash
ฉันรู้สึกสับสนในการเขียน bash เสร็จเป็นครั้งแรกและฉันสับสนเล็กน้อยเกี่ยวกับสองวิธีในการยกเลิกการอ้างอิงอาร์เรย์แบช (${array[@]}และ${array[*]}) นี่คือส่วนของรหัสที่เกี่ยวข้อง (มันใช้งานได้ แต่ฉันอยากจะเข้าใจให้ดีขึ้น): _switch() { local cur perls local ROOT=${PERLBREW_ROOT:-$HOME/perl5/perlbrew} COMPREPLY=() cur=${COMP_WORDS[COMP_CWORD]} perls=($ROOT/perls/perl-*) # remove all but the final part of the name perls=(${perls[*]##*/}) COMPREPLY=( $( compgen -W "${perls[*]} /usr/bin/perl" -- ${cur} ) ) } เอกสารของ bash กล่าวว่า : องค์ประกอบใด ๆ ของอาร์เรย์สามารถอ้างอิงได้โดยใช้ $ {name [subscript]} ต้องใช้วงเล็บปีกกาเพื่อหลีกเลี่ยงความขัดแย้งกับตัวดำเนินการขยายชื่อไฟล์ของเชลล์ …

3
cp -r โดยไม่มีไฟล์ที่ซ่อนอยู่
ฉันมีสองไดเรกทอรีและหนึ่งว่างเปล่า ไดเร็กทอรีแรกมีไดเร็กทอรีย่อยจำนวนมากที่มีไฟล์ซ่อนอยู่ เมื่อฉันcp -rเนื้อหาจากไดเร็กทอรีแรกไปยังไดเร็กทอรีที่สองไฟล์ที่ซ่อนอยู่จะถูกคัดลอกไปด้วย วิธีแก้ปัญหาใด ๆ เพื่อหลีกหนีพวกเขา?
90 linux  bash  cp 

13
บังคับให้ล้างเอาต์พุตไปยังไฟล์ในขณะที่สคริปต์ bash ยังทำงานอยู่
ฉันมีสคริปต์เล็ก ๆ ซึ่งเรียกว่าทุกวันโดย crontab โดยใช้คำสั่งต่อไปนี้: /homedir/MyScript &> some_log.log ปัญหาของวิธีนี้คือ some_log.log ถูกสร้างขึ้นหลังจาก MyScript เสร็จสิ้นเท่านั้น ฉันต้องการล้างผลลัพธ์ของโปรแกรมลงในไฟล์ในขณะที่กำลังทำงานอยู่เพื่อที่ฉันจะได้ทำสิ่งต่างๆเช่น tail -f some_log.log และติดตามความคืบหน้า ฯลฯ
90 bash  file  flush 

10
ใช้เครื่องหมายดาวใน grep
ฉันพยายามค้นหาสตริงย่อย "abc" ในไฟล์เฉพาะใน linux / bash ดังนั้นฉันจึง: grep '*abc*' myFile มันกลับไม่มีอะไร แต่ถ้าฉันทำ: grep 'abc' myFile ส่งคืนการจับคู่อย่างถูกต้อง ตอนนี้นี่ไม่ใช่ปัญหาสำหรับฉัน แต่ถ้าฉันต้องการ grep สำหรับสตริงที่ซับซ้อนกว่านี้ให้พูดว่า *abc * def * ฉันจะทำมันให้สำเร็จโดยใช้ grep ได้อย่างไร
90 regex  bash  grep 

12
จะสร้าง bash script เพื่อตรวจสอบการเชื่อมต่อ SSH ได้อย่างไร?
ฉันกำลังสร้างสคริปต์ทุบตีที่จะล็อกเข้าสู่เครื่องระยะไกลและสร้างคีย์ส่วนตัวและคีย์สาธารณะ ปัญหาของฉันคือเครื่องระยะไกลไม่น่าเชื่อถือมากนักและไม่ได้ทำงานตลอดเวลา ฉันต้องการสคริปต์ทุบตีที่จะตรวจสอบว่าการเชื่อมต่อ SSH ทำงานอยู่หรือไม่ ก่อนที่จะสร้างคีย์เพื่อใช้งานจริงในอนาคต.
90 bash  ssh  connection 

7
ฉันควรส่งสัญญาณไปยังกระบวนการปิดระบบอย่างสง่างามในลำดับใด
ในความคิดเห็นเกี่ยวกับคำตอบของคำถามอื่นผู้แสดงความคิดเห็นกล่าวว่า: อย่าใช้ kill -9 เว้นแต่จำเป็นจริงๆ! SIGKILL ไม่สามารถติดกับดักได้ดังนั้นโปรแกรมที่ถูกฆ่าจึงไม่สามารถรันขั้นตอนการปิดระบบใด ๆ เพื่อลบไฟล์ชั่วคราว ขั้นแรกให้ลองใช้ HUP (1) จากนั้น INT (2) จากนั้นจึง QUIT (3) ฉันเห็นด้วยในหลักการเกี่ยวกับSIGKILLแต่ส่วนที่เหลือเป็นข่าวสำหรับฉัน เนื่องจากสัญญาณเริ่มต้นที่ส่งมาkillคือSIGTERMฉันคาดว่าจะเป็นสัญญาณที่คาดหวังมากที่สุดสำหรับการปิดกระบวนการโดยพลการอย่างสง่างาม นอกจากนี้ฉันพบว่ามีการSIGHUPใช้ด้วยเหตุผลที่ไม่ยุติเช่นการบอก daemon ว่า "อ่านไฟล์ config ของคุณอีกครั้ง" และสำหรับฉันแล้วดูเหมือนว่าSIGINT(การขัดจังหวะแบบเดียวกับที่คุณมักจะได้รับจาก Ctrl-C ใช่ไหม) ไม่ได้รับการสนับสนุนอย่างกว้างขวางเท่าที่ควรหรือยุติอย่างไม่น่าเคารพ ระบุว่าSIGKILLเป็นทางเลือกสุดท้าย - คุณควรส่งสัญญาณใดและในลำดับใดไปยังกระบวนการตามอำเภอใจเพื่อที่จะปิดมันลงอย่างสง่างามที่สุด โปรดยืนยันคำตอบของคุณพร้อมข้อมูลสนับสนุน (นอกเหนือจากความชอบส่วนตัวหรือความคิดเห็น) หรือข้อมูลอ้างอิงหากทำได้ หมายเหตุ: ฉันสนใจแนวทางปฏิบัติที่ดีที่สุดซึ่งรวมถึงการพิจารณา bash / Cygwin เป็นพิเศษ แก้ไข:จนถึงตอนนี้ดูเหมือนจะไม่มีใครพูดถึง INT หรือ QUIT และมีการกล่าวถึง HUP อย่าง จำกัด …

2
อะไรคือความแตกต่างระหว่างการใช้ Terminal บน mac vs linux? [ปิด]
ปิด. คำถามนี้เป็นคำถามปิดหัวข้อ ขณะนี้ยังไม่ยอมรับคำตอบ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้เป็นหัวข้อสำหรับ Stack Overflow ปิดให้บริการใน9 ปีที่ผ่านมา ปรับปรุงคำถามนี้ ฉันใช้ Ubuntu มาสี่ปีแล้ว ฉันมีความรู้พื้นฐานเกี่ยวกับคำสั่งเชลล์และฉันชอบทำงานในเทอร์มินัลมากกว่าใช้ GUI ฉันเพิ่งเริ่มใช้ Mac ฉันได้ลองใช้คำสั่งเทอร์มินัลสองสามคำ (ที่ฉันใช้บน Ubuntu) ในเทอร์มินัล Mac และดูเหมือนว่าจะตอบสนองในลักษณะเดียวกันเป็นส่วนใหญ่ มีความแตกต่างอย่างมีนัยสำคัญในคำสั่งที่ฉันใช้งานที่ทำหรือสภาพแวดล้อมเชลล์ที่ฉันควรทราบหรือไม่
89 macos  bash  shell  ubuntu  terminal 

6
จะเพิ่มที่ท้ายบรรทัดที่มีรูปแบบด้วย sed หรือ awk ได้อย่างไร?
นี่คือไฟล์ตัวอย่าง: somestuff... all: thing otherthing some other stuff สิ่งที่ฉันต้องการทำคือเพิ่มในบรรทัดที่ขึ้นต้นด้วยall:สิ่งนี้: somestuff... all: thing otherthing anotherthing some other stuff
89 bash  sed  awk 

4
วิธีแสดงหมายเลขบรรทัดเมื่อเรียกใช้สคริปต์ทุบตี
ฉันมีสคริปต์ทดสอบที่มีคำสั่งจำนวนมากและจะสร้างเอาต์พุตจำนวนมากฉันใช้set -xหรือset -vและset -eดังนั้นสคริปต์จะหยุดเมื่อเกิดข้อผิดพลาด อย่างไรก็ตามยังค่อนข้างยากสำหรับฉันในการค้นหาว่าบรรทัดใดหยุดการดำเนินการเพื่อค้นหาปัญหา มีวิธีการที่สามารถส่งออกหมายเลขบรรทัดของสคริปต์ก่อนที่จะดำเนินการแต่ละบรรทัดหรือไม่? หรือส่งออกหมายเลขบรรทัดก่อนนิทรรศการคำสั่งที่สร้างโดยset -x? หรือวิธีการใด ๆ ที่สามารถจัดการกับปัญหาตำแหน่งบรรทัดสคริปต์ของฉันจะช่วยได้มาก ขอบคุณ.
89 linux  bash  testing 

13
ใช้ sed เพื่อเปลี่ยนชื่อไฟล์จำนวนมาก
วัตถุประสงค์ เปลี่ยนชื่อไฟล์เหล่านี้: F00001-0708-RG-biasliuyda F00001-0708-CS-akgdlaul F00001-0708-VF-hioulgigl ไปยังชื่อไฟล์เหล่านี้: F0001-0708-RG-biasliuyda F0001-0708-CS-akgdlaul F0001-0708-VF-hioulgigl รหัสเชลล์ ทดสอบ: ls F00001-0708-*|sed 's/\(.\).\(.*\)/mv & \1\2/' ในการดำเนินการ: ls F00001-0708-*|sed 's/\(.\).\(.*\)/mv & \1\2/' | sh คำถามของฉัน ฉันไม่เข้าใจรหัส sed ฉันเข้าใจคำสั่งการแทนที่ $ sed 's/something/mv' หมายถึง. และฉันเข้าใจนิพจน์ทั่วไปบ้าง แต่ฉันไม่เข้าใจว่าเกิดอะไรขึ้นที่นี่: \(.\).\(.*\) หรือที่นี่: & \1\2/ สำหรับฉันในอดีตดูเหมือนว่ามันหมายถึง: "อักขระเดี่ยวตามด้วยอักขระเดี่ยวตามด้วยลำดับความยาวของอักขระเดี่ยว" - แต่แน่นอนว่ามีอะไรมากกว่านั้น เท่าที่ส่วนหลัง: & \1\2/ ฉันไม่รู้.
89 bash  shell  sed  file-rename 


4
การจับคู่ Regex ในคำสั่ง Bash if
ฉันทำอะไรผิดที่นี่? พยายามจับคู่สตริงที่มีช่องว่างตัวพิมพ์เล็กตัวพิมพ์ใหญ่หรือตัวเลข อักขระพิเศษก็น่าจะดีเช่นกัน แต่ฉันคิดว่าต้องมีการหลีกเลี่ยงอักขระบางตัว TEST="THIS is a TEST title with some numbers 12345 and special char *&^%$#" if [[ "$TEST" =~ [^a-zA-Z0-9\ ] ]]; then BLAH; fi เห็นได้ชัดว่านี่เป็นการทดสอบเฉพาะบนล่างตัวเลขและช่องว่าง ใช้งานไม่ได้ * อัพเดท * ฉันเดาว่าฉันควรจะเจาะจงมากกว่านี้ นี่คือบรรทัดจริงของรหัส if [[ "$TITLE" =~ [^a-zA-Z0-9\ ] ]]; then RETURN="FAIL" && ERROR="ERROR: Title can only contain upper …

12
วนซ้ำ tuples ใน bash?
เป็นไปได้ไหมที่จะวนซ้ำสิ่งที่ทับซ้อนในทุบตี? ตัวอย่างเช่นจะเป็นการดีหากสิ่งต่อไปนี้ได้ผล: for (i,j) in ((c,3), (e,5)); do echo "$i and $j"; done มีวิธีแก้ปัญหาที่ทำให้ฉันวนรอบสิ่งที่เพิ่มขึ้นได้หรือไม่?
89 bash  for-loop 

12
บังคับให้ bash ขยายตัวแปรในสตริงที่โหลดจากไฟล์
ฉันกำลังพยายามหาวิธีทำให้ bash (แรง?) ขยายตัวแปรในสตริง (ซึ่งโหลดจากไฟล์) ฉันมีไฟล์ชื่อ "something.txt" ที่มีเนื้อหา: hello $FOO world จากนั้นฉันก็วิ่ง export FOO=42 echo $(cat something.txt) ผลตอบแทนนี้: hello $FOO world มันไม่ได้ขยาย $ FOO แม้ว่าจะตั้งค่าตัวแปรไว้ก็ตาม ฉันไม่สามารถประเมินหรือซอร์สไฟล์ได้เพราะมันจะพยายามและเรียกใช้งาน (มันไม่สามารถเรียกใช้งานได้อย่างที่เป็นอยู่ - ฉันแค่ต้องการสตริงที่มีการแทรกตัวแปร) ความคิดใด ๆ ?
89 linux  bash  shell  unix 

8
สคริปต์เพื่อรับรหัสสถานะ HTTP ของรายการ URL?
ฉันมีรายการ URL ที่ต้องตรวจสอบเพื่อดูว่ายังใช้งานได้หรือไม่ ฉันต้องการเขียนสคริปต์ทุบตีที่ทำเพื่อฉัน ฉันต้องการรหัสสถานะ HTTP ที่ส่งคืนเท่านั้นเช่น 200, 404, 500 เป็นต้น ไม่มีอะไรมาก แก้ไขโปรดทราบว่ามีปัญหาหากหน้าระบุว่า "ไม่พบ 404" แต่ส่งกลับข้อความ 200 OK เป็นเว็บเซิร์ฟเวอร์ที่กำหนดค่าไม่ถูกต้อง แต่คุณอาจต้องพิจารณากรณีนี้ สำหรับข้อมูลเพิ่มเติมโปรดดูที่ตรวจสอบว่า URL ไปยังหน้าที่มีข้อความ "404" หรือไม่

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