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

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

4
การประมวลผลสคริปต์ Bash มีจำนวนคำสั่งที่ จำกัด ในแบบคู่ขนาน
ฉันมีสคริปต์ทุบตีที่มีลักษณะเช่นนี้: #!/bin/bash wget LINK1 >/dev/null 2>&1 wget LINK2 >/dev/null 2>&1 wget LINK3 >/dev/null 2>&1 wget LINK4 >/dev/null 2>&1 # .. # .. wget LINK4000 >/dev/null 2>&1 แต่การประมวลผลแต่ละบรรทัดจนกว่าคำสั่งจะเสร็จสิ้นจากนั้นการย้ายไปยังบรรทัดถัดไปนั้นใช้เวลานานมากฉันต้องการประมวลผลอินสแตนซ์ 20 บรรทัดในครั้งเดียวแล้วเมื่อประมวลผลเสร็จแล้วอีก 20 บรรทัด ฉันคิดว่าwget LINK1 >/dev/null 2>&1 &จะส่งคำสั่งไปที่พื้นหลังและดำเนินการต่อ แต่มี 4000 บรรทัดนี่หมายความว่าฉันจะมีปัญหาด้านประสิทธิภาพไม่พูดถึงการถูก จำกัด ในจำนวนกระบวนการที่ฉันควรเริ่มในเวลาเดียวกันดังนั้นจึงไม่ดี ความคิด ทางออกหนึ่งที่ฉันคิดในตอนนี้คือการตรวจสอบว่าหนึ่งในคำสั่งยังคงทำงานอยู่หรือไม่ตัวอย่างเช่นหลังจาก 20 บรรทัดฉันสามารถเพิ่มลูปนี้: while [ $(ps -ef | …
196 linux  bash  shell 



30
ฉันจะรวมตัวเลขทั้งหมดในไฟล์ได้อย่างรวดเร็วได้อย่างไร
ฉันมีไฟล์ที่มีหลายพันตัวเลขโดยแต่ละไฟล์เป็นของตัวเอง: 34 42 11 6 2 99 ... ฉันต้องการเขียนสคริปต์ซึ่งจะพิมพ์ผลรวมของตัวเลขทั้งหมดในไฟล์ ฉันมีวิธีแก้ปัญหาแล้ว แต่มันก็ไม่ได้มีประสิทธิภาพมากนัก (ใช้เวลาหลายนาทีในการทำงาน) ฉันกำลังมองหาโซลูชันที่มีประสิทธิภาพมากขึ้น ข้อเสนอแนะใด ๆ
195 linux  perl  bash  shell  awk 

12
ฉันจะได้รับการทุบตีเสร็จสิ้นเพื่อทำงานกับนามแฝงได้อย่างไร
กรณีในจุด: ฉันเป็น mac ที่มี bash v3.2.17 ฉันใช้ git ติดตั้งผ่าน macports กับตัวแปร bash_completion git checkout m<tab>เมื่อฉันพิมพ์ masterสำหรับตัวอย่างเช่นผมได้รับมันเสร็จสิ้นการ แต่ผมได้มีชื่อแทน,git checkout gcoเมื่อฉันพิมพ์gco m<tab>ฉันจะไม่ได้รับชื่อสาขาที่เติมข้อความอัตโนมัติ เป็นการดีที่ฉันต้องการการเติมข้อความอัตโนมัติเพื่อทำงานแทนนามแฝงทั้งหมดของฉันอย่างน่าอัศจรรย์ เป็นไปได้ไหม? ความล้มเหลวนั้นฉันต้องการกำหนดค่าด้วยตนเองสำหรับแต่ละนามแฝง ดังนั้นฉันจะไปเกี่ยวกับวิธีใด
195 git  bash  shell  unix  autocomplete 

8
คำสั่ง `date` บน OS X ไม่มีตัวเลือก ISO 8601` -I`
ในสคริปต์ Bash ฉันต้องการพิมพ์วันที่และเวลาปัจจุบันในรูปแบบISO 8601 (ควรเป็น UTC) และดูเหมือนว่าสิ่งนี้ควรเป็นเรื่องง่ายเหมือนdate -I: http://ss64.com/bash/date.html แต่นี่ดูเหมือนจะใช้งานไม่ได้บน Mac ของฉัน: $ date -I date: illegal option -- I usage: date [-jnu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ... [-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format] และแน่นอนman dateไม่ได้แสดงรายการตัวเลือกนี้ ใครรู้ว่าทำไมเป็นเช่นนี้หรือวิธีอื่น ๆ (ง่าย) สำหรับฉันในการพิมพ์วันที่ในรูปแบบ ISO 8601 ขอบคุณ!
194 bash  macos  iso8601 

10
เปลี่ยนจาก zsh เป็น bash บน OSX และกลับมาอีกครั้งหรือไม่
ดังนั้นฉันจึงเรียนรู้ที่จะพัฒนาใน Rails และได้ค้นพบพลังของ zsh อย่างไรก็ตามสำหรับงานอื่นของฉันฉันต้องการใช้ Bash ปกติ แม้ว่าพวกเขาจะเหมือนกัน แต่ฉันก็รู้สึกสบายใจกับการถูกไล่ออกจากงานในบางสถานการณ์ ฉันจะสลับไปมาหรือเปิดและปิด zsh ได้อย่างไร ขอบคุณ!
194 bash  terminal  zsh 

5
สลับเคสด้วยการตกหล่นหรือไม่
ฉันกำลังมองหาไวยากรณ์ที่ถูกต้องของคำสั่งสลับกับกรณีที่ผิดพลาดใน Bash (นึกคิดกรณีเล็ก ๆ น้อย ๆ ) ใน PHP ฉันต้องการเขียนโปรแกรมเช่น: switch($c) { case 1: do_this(); break; case 2: case 3: do_what_you_are_supposed_to_do(); break; default: do_nothing(); } ฉันต้องการเหมือนกันใน Bash: case "$C" in "1") do_this() ;; "2") "3") do_what_you_are_supposed_to_do() ;; *) do_nothing(); ;; esac สิ่งนี้ไม่ทำงาน: ฟังก์ชั่นdo_what_you_are_supposed_to_do()ควรถูกไล่ออกเมื่อ $ C เป็น 2 หรือ 3

7
ส่งผ่านตัวแปรทั้งหมดจากเชลล์สคริปต์หนึ่งไปยังอีกเชลล์หรือไม่
ให้บอกว่าฉันมีเชลล์ / ทุบตีสคริปต์ชื่อtest.shด้วย: #!/bin/bash TESTVARIABLE=hellohelloheloo ./test2.sh test2.shหน้าตาของฉันเป็นแบบนี้: #!/bin/bash echo ${TESTVARIABLE} สิ่งนี้ใช้ไม่ได้ ฉันไม่ต้องการที่จะผ่านตัวแปรทั้งหมดเป็นพารามิเตอร์ตั้งแต่ imho นี้เป็น overkill มีวิธีอื่นไหม
193 bash  shell 

7
แก้ไขการใช้อักษรตัวพิมพ์ใหญ่ของตัวแปรสคริปต์ Bash และ shell
ฉันใช้เชลล์สคริปต์จำนวนมากที่มีตัวแปรในตัวพิมพ์ใหญ่ทั้งหมดและฉันคิดเสมอว่ามีความเข้าใจผิดที่รุนแรง ความเข้าใจของฉันคือว่าโดยการประชุม (และอาจจำเป็นนานแล้ว) ตัวแปรสภาพแวดล้อมอยู่ในตัวพิมพ์ใหญ่ทั้งหมด แต่ในสภาพแวดล้อมที่มีการเขียนสคริปต์ที่ทันสมัยเช่นทุบตีฉันได้ต้องการเสมอประชุมของชื่อกรณีที่ต่ำกว่าสำหรับตัวแปรชั่วคราวและคนบนกรณีเฉพาะสำหรับการส่งออกตัวแปร (เช่นสภาพแวดล้อม) ตัวอย่างเช่น: #!/usr/bin/env bash year=`date +%Y` echo "It is $year." export JAVA_HOME="$HOME/java" นั่นเป็นสิ่งที่ฉันทำ มีแหล่งข้อมูลที่เชื่อถือได้ซึ่งเห็นด้วยหรือไม่เห็นด้วยกับวิธีการนี้หรือเป็นเรื่องของสไตล์อย่างหมดจดหรือไม่?

6
คุ้มค่าที่จะเปลี่ยนเป็น zsh เพื่อการใช้งานทั่วไป [ปิด]
ปิด. คำถามนี้เป็นคำถามปิดหัวข้อ ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้เป็นไปตามหัวข้อสำหรับ Stack Overflow ปิดให้บริการใน8 ปีที่ผ่านมา ปรับปรุงคำถามนี้ เชลล์เริ่มต้นใน Mac OS X คือbashซึ่งโดยทั่วไปฉันยินดีที่จะใช้ ฉันแค่เอามันไปให้ มันจะดีจริงๆถ้ามันเติมข้อมูลให้โดยอัตโนมัติและฉันก็ได้ยินเรื่องดีๆzshในเรื่องนี้ แต่ฉันไม่มีความชอบที่จะใช้เวลาหลายชั่วโมงกับการตั้งค่าเพื่อปรับปรุงการใช้บรรทัดคำสั่งของฉันด้วยจำนวนเล็กน้อยเนื่องจากชีวิตของฉันในบรรทัดคำสั่งนั้นไม่เลวเลย (ตามที่ฉันเข้าใจมันbashสามารถกำหนดค่าให้เติมข้อมูลอัตโนมัติได้อย่างชาญฉลาดยิ่งขึ้นนี่คือการกำหนดค่าที่ฉันไม่ได้สนใจทั้งหมด) การเปลี่ยนไปใช้zshแม้ในกรณีจำนวนน้อยจะทำให้ชีวิตของฉันง่ายขึ้นหรือไม่ หรือเป็นเพียงเปลือกหอยที่ดีกว่าถ้าคุณใส่ในเวลาที่จะเรียนรู้ว่าทำไมมันถึงดีกว่า? (ตัวอย่างจะดีเช่นกัน:)) @ Rodney Amato & @ Vulcan Eager ให้เหตุผลสองข้อที่ดีในการติดbashและเปลี่ยนไปตามลำดับzshและสลับไปดูเหมือนว่าฉันจะต้องตรวจสอบทั้งสองอย่าง! โอ้ดี:) มีใครบ้างที่มีความเห็นจากทั้งสองด้านของการโต้แย้ง?
192 bash  shell  zsh 

3
การใช้ตัวแปรภายใน bash heredoc
ฉันพยายามแก้ไขตัวแปรภายใน bash heredoc: var=$1 sudo tee "/path/to/outfile" > /dev/null << "EOF" Some text that contains my $var EOF สิ่งนี้ไม่ทำงานอย่างที่ฉันคาดไว้ ( $varได้รับการปฏิบัติอย่างแท้จริงไม่ขยาย) ฉันต้องใช้sudo teeเพราะการสร้างไฟล์ต้องใช้ sudo ทำสิ่งที่ชอบ: sudo cat > /path/to/outfile <<EOT my text... EOT ไม่ทำงานเพราะ>outfileเปิดไฟล์ในเชลล์ปัจจุบันซึ่งไม่ได้ใช้งาน sudo
192 bash  variables  sh  heredoc 

8
วิธีการใช้คำสั่งเชลล์กับแต่ละบรรทัดของเอาต์พุตคำสั่ง
สมมติว่าฉันมีเอาต์พุตบางส่วนจากคำสั่ง (เช่นls -1): a b c d e ... ฉันต้องการที่จะใช้คำสั่ง (พูดecho) กับแต่ละคนในทางกลับกัน เช่น echo a echo b echo c echo d echo e ... เป็นวิธีที่ง่ายที่สุดในการทุบตีอะไร
192 bash 

9
วิธีลบไฟล์ที่เก่ากว่า X ชั่วโมง
ฉันกำลังเขียนสคริปต์ทุบตีที่ต้องการลบไฟล์เก่า ปัจจุบันมีการใช้งานโดย: find $LOCATION -name $REQUIRED_FILES -type f -mtime +1 -delete การดำเนินการนี้จะลบไฟล์ที่เก่ากว่า 1 วัน อย่างไรก็ตามถ้าฉันต้องการความละเอียดที่ละเอียดกว่านั้นใน 1 วันพูดเหมือนอายุ 6 ชั่วโมงล่ะ มีวิธีทำความสะอาดที่ดีที่จะทำเช่นมีการใช้การค้นหาและเวลา?
191 bash 

4
วิธีสร้างไดเรกทอรีย่อยที่ไม่มีอยู่ซ้ำโดยใช้ Bash
ฉันกำลังสร้างสคริปต์สำรองอย่างรวดเร็วที่จะถ่ายโอนฐานข้อมูลบางส่วนไปยังโครงสร้างไดเรกทอรีที่ดี / เรียบร้อยและฉันรู้ว่าฉันต้องทดสอบเพื่อให้แน่ใจว่าไดเรกทอรีมีอยู่ก่อนที่ฉันจะสร้างพวกเขา รหัสที่ฉันใช้งานได้ แต่ดูเหมือนว่ามีวิธีที่ดีกว่าที่จะทำ ข้อเสนอแนะใด ๆ [ -d "$BACKUP_DIR" ] || mkdir "$BACKUP_DIR" [ -d "$BACKUP_DIR/$client" ] || mkdir "$BACKUP_DIR/$client" [ -d "$BACKUP_DIR/$client/$year" ] || mkdir "$BACKUP_DIR/$client/$year" [ -d "$BACKUP_DIR/$client/$year/$month" ] || mkdir "$BACKUP_DIR/$client/$year/$month" [ -d "$BACKUP_DIR/$client/$year/$month/$day" ] || mkdir "$BACKUP_DIR/$client/$year/$month/$day"

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