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

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

5
ถ้า, elif, else มีคำสั่งใน Bash
ฉันไม่สามารถดูเหมือนจะทำงานออกว่าปัญหาที่มีดังต่อไปนี้ifคำสั่งในการไปถึงและelif thenโปรดทราบว่าprintfยังคงอยู่ในระหว่างการพัฒนาฉันไม่สามารถทดสอบได้ในแถลงการณ์ ข้อผิดพลาดที่ฉันได้รับคือ: ./timezone_string.sh: line 14: syntax error near unexpected token `then' ./timezone_string.sh: line 14: `then' และคำสั่งเป็นเช่นนั้น if [ "$seconds" -eq 0 ];then $timezone_string="Z" elif[ "$seconds" -gt 0 ] then $timezone_string=`printf "%02d:%02d" $seconds/3600 ($seconds/60)%60` else echo "Unknown parameter" fi
358 bash  if-statement 

9
วัตถุประสงค์ของ“ &&” ในคำสั่งเชลล์คืออะไร
เท่าที่ฉันรู้การใช้&คำสั่งหลังจากนั้นสำหรับการรันในพื้นหลัง ตัวอย่าง&การใช้งาน:tar -czf file.tar.gz dirname & แต่จะเป็น&&อย่างไร (ดูตัวอย่างนี้: /server/215179/centos-100-disk-full-how-to-remove-log-files-history-etc#answer-215188 )

21
วิธีที่ดีที่สุดที่จะรวมสคริปต์อื่น ๆ
วิธีที่คุณจะรวมสคริปต์ไว้กับ "แหล่ง" เช่น: main.sh: #!/bin/bash source incl.sh echo "The main script" incl.sh: echo "The included script" ผลลัพธ์ของการดำเนินการ "./main.sh" คือ: The included script The main script ... ตอนนี้ถ้าคุณพยายามเรียกใช้งานเชลล์สคริปต์จากตำแหน่งอื่นจะไม่สามารถหาการรวมได้เว้นแต่จะอยู่ในเส้นทางของคุณ เป็นวิธีที่ดีในการตรวจสอบให้แน่ใจว่าสคริปต์ของคุณสามารถค้นหาสคริปต์รวมโดยเฉพาะอย่างยิ่งถ้าเช่นสคริปต์จะต้องพกพา?
353 bash 

5
การตั้งค่าตัวแปรสภาพแวดล้อมก่อนที่คำสั่งใน Bash จะไม่ทำงานสำหรับคำสั่งที่สองในไพพ์
ในเชลล์ที่กำหนดโดยปกติฉันจะตั้งค่าตัวแปรหรือตัวแปรแล้วเรียกใช้คำสั่ง เมื่อเร็ว ๆ นี้ฉันได้เรียนรู้เกี่ยวกับแนวคิดของการเพิ่มคำนิยามตัวแปรให้กับคำสั่ง: FOO=bar somecommand someargs มันใช้งานได้ ... มันไม่ทำงานเมื่อคุณเปลี่ยนตัวแปร LC_ * (ซึ่งดูเหมือนว่าจะส่งผลกระทบต่อคำสั่ง แต่ไม่ใช่ข้อโต้แย้งตัวอย่างเช่น '[az]' ช่วงถ่าน) หรือเมื่อไพพ์เอาต์พุตไปยังคำสั่งอื่น: FOO=bar somecommand someargs | somecommand2 # somecommand2 is unaware of FOO ฉันสามารถเติม somecommand2 ด้วย "FOO = bar" ได้ด้วยซึ่งใช้งานได้ แต่เพิ่มการซ้ำซ้อนที่ไม่ต้องการและไม่ช่วยอาร์กิวเมนต์ที่ตีความขึ้นอยู่กับตัวแปร (เช่น '[az]') ดังนั้นวิธีที่ดีในการทำเช่นนี้ในบรรทัดเดียวคืออะไร? ฉันกำลังคิดบางอย่างตามคำสั่งของ: FOO=bar (somecommand someargs | somecommand2) # Doesn't actually work ฉันได้รับคำตอบที่ดีมากมาย! …

4
วิธีการวนซ้ำอาร์เรย์ที่เชื่อมโยงใน Bash
ตามอาเรย์ที่เชื่อมโยงกันในสคริปต์ Bash ฉันจำเป็นต้องวนซ้ำเพื่อรับคีย์และค่า #!/bin/bash declare -A array array[foo]=bar array[bar]=foo ที่จริงฉันไม่เข้าใจวิธีการรับกุญแจขณะใช้ for-in loop

4
ประวัติ Bash ไม่ จำกัด [ปิด]
ปิด. คำถามนี้ไม่เป็นไปตามหลักเกณฑ์กองมากเกิน ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้เป็นไปตามหัวข้อสำหรับ Stack Overflow ปิดให้บริการใน6 ปีที่ผ่านมา ปรับปรุงคำถามนี้ ฉันต้องการให้.bash_historyไฟล์ของฉันไม่ จำกัด เช่นดังนั้นฉันสามารถย้อนกลับไปและดูว่าฉันสร้าง / กำหนดค่าบางสิ่งหรือคำสั่งที่ดีหรือว่าคำสั่งบางคำสั่งทำลายบางสิ่งบางอย่างเมื่อหลายสัปดาห์ก่อน ฉันจะเปลี่ยนการตั้งค่านี้ได้อย่างไร
350 bash  unix 

12
เป็นวิธีที่สะอาดที่สุดในการ ssh และเรียกใช้หลายคำสั่งใน Bash คืออะไร?
ฉันมีการตั้งค่าตัวแทน ssh แล้วและฉันสามารถเรียกใช้คำสั่งบนเซิร์ฟเวอร์ภายนอกใน Bash script ทำสิ่งต่าง ๆ เช่น: ssh blah_server "ls; pwd;" ตอนนี้สิ่งที่ฉันอยากทำจริง ๆ ก็คือรันคำสั่งยาวจำนวนมากบนเซิร์ฟเวอร์ภายนอก การรวมสิ่งเหล่านี้ไว้ระหว่างเครื่องหมายอัญประกาศค่อนข้างน่าเกลียดและฉันควรหลีกเลี่ยงหลาย ๆ ครั้งเพื่อหลีกเลี่ยงปัญหานี้ ดังนั้นมีวิธีที่ฉันสามารถทำได้ในครั้งเดียวล้อมรอบด้วยวงเล็บหรืออะไร? ฉันกำลังมองหาบางอย่างตามแนวของ: ssh blah_server ( ls some_folder; ./someaction.sh; pwd; ) โดยทั่วไปฉันจะมีความสุขกับการแก้ปัญหาใด ๆ ตราบเท่าที่มันสะอาด แก้ไข เพื่ออธิบายให้ชัดเจนฉันกำลังพูดถึงสิ่งนี้เป็นส่วนหนึ่งของสคริปต์ทุบตีที่ใหญ่กว่า คนอื่นอาจต้องจัดการกับสคริปต์ลงบรรทัดดังนั้นฉันต้องการให้มันสะอาด ฉันไม่ต้องการมีสคริปต์ทุบตีที่มีหนึ่งบรรทัดที่มีลักษณะ: ssh blah_server "ls some_folder; ./someaction.sh 'some params'; pwd; ./some_other_action 'other params';" เพราะมันน่าเกลียดและยากที่จะอ่าน
349 bash  unix  ssh 

18
ฉันจะฆ่ากระบวนการด้วยชื่อแทนที่จะเป็น PID ได้อย่างไร
บางครั้งเมื่อฉันพยายามเริ่ม Firefox คำว่า "กระบวนการ Firefox กำลังทำงานอยู่" ดังนั้นฉันต้องทำสิ่งนี้: jeremy@jeremy-desktop:~$ ps aux | grep firefox jeremy 7451 25.0 27.4 170536 65680 ? Sl 22:39 1:18 /usr/lib/firefox-3.0.1/firefox jeremy 7578 0.0 0.3 3004 768 pts/0 S+ 22:44 0:00 grep firefox jeremy@jeremy-desktop:~$ kill 7451 สิ่งที่ฉันต้องการคือคำสั่งที่จะทำทุกอย่างให้ฉัน มันจะใช้สตริงอินพุตและgrepมัน (หรืออะไรก็ตาม) ในรายการของกระบวนการและจะฆ่ากระบวนการทั้งหมดในผลลัพธ์: jeremy@jeremy-desktop:~$ killbyname firefox ฉันพยายามทำมันใน PHP แต่exec('ps aux')ดูเหมือนว่าจะแสดงเฉพาะกระบวนการที่ถูกดำเนินการด้วยexec()สคริปต์ …
349 linux  bash  shell 

12
มีคำสั่ง TRY CATCH ใน Bash หรือไม่
ฉันกำลังเขียนเชลล์สคริปต์และจำเป็นต้องตรวจสอบว่ามีการติดตั้งแอปเทอร์มินัล ฉันต้องการใช้คำสั่งลอง / จับเพื่อทำสิ่งนี้เว้นแต่จะมีวิธีการที่เหนือกว่า


4
วิธีจำกัดความลึกสำหรับรายการไฟล์วนซ้ำ?
มีวิธีจำกัดความลึกของรายการไฟล์วนซ้ำใน linux หรือไม่? คำสั่งที่ฉันใช้ในขณะนี้คือ: ls -laR > dirlist.txt แต่ฉันมีประมาณ 200 ไดเรกทอรีและแต่ละอันมี 10 ไดเรกทอรี ดังนั้นมันจะใช้เวลานานเกินไปและทำให้ทรัพยากรระบบมากเกินไป สิ่งที่ฉันสนใจจริงๆคือข้อมูลความเป็นเจ้าของและการอนุญาตสำหรับไดเรกทอรีย่อยระดับแรก: drwxr-xr-x 14 root root 1234 Dec 22 13:19 /var/www/vhosts/domain1.co.uk drwxr--r-- 14 jon root 1234 Dec 22 13:19 /var/www/vhosts/domain1.co.uk/htdocs drwxr--r-- 14 jon root 1234 Dec 22 13:19 /var/www/vhosts/domain1.co.uk/cgi-bin drwxr-xr-x 14 root root 1234 Dec 22 13:19 …
346 linux  bash 

7
ตัวอย่างของวิธีใช้ getopts ใน bash
ฉันต้องการโทรหาmyscriptไฟล์ด้วยวิธีนี้: $ ./myscript -s 45 -p any_string หรือ $ ./myscript -h #should display help $ ./myscript #should display help ความต้องการของฉันคือ: getopt ที่นี่เพื่อรับอาร์กิวเมนต์อินพุต ตรวจสอบว่า-sมีอยู่หากไม่ส่งคืนข้อผิดพลาด ตรวจสอบว่าค่าหลังจากนั้น-sคือ 45 หรือ 90 ตรวจสอบว่า-pมีอยู่และมีสตริงอินพุตหลังจาก หากผู้ใช้เข้าสู่./myscript -hหรือเพียง./myscriptแสดงความช่วยเหลือ ฉันพยายามจนถึงรหัสนี้: #!/bin/bash while getopts "h:s:" arg; do case $arg in h) echo "usage" ;; s) strength=$OPTARG echo $strength ;; esac …
345 bash  shell  getopts 

10
Pseudo-terminal จะไม่ถูกจัดสรรเนื่องจาก stdin ไม่ใช่เทอร์มินัล
ฉันพยายามเขียนเชลล์สคริปต์ที่สร้างบางไดเรกทอรีบนเซิร์ฟเวอร์ระยะไกลแล้วใช้ scp เพื่อคัดลอกไฟล์จากเครื่องท้องถิ่นของฉันไปยังระยะไกล นี่คือสิ่งที่ฉันมี: ssh -t user@server<<EOT DEP_ROOT='/home/matthewr/releases' datestamp=$(date +%Y%m%d%H%M%S) REL_DIR=$DEP_ROOT"/"$datestamp if [ ! -d "$DEP_ROOT" ]; then echo "creating the root directory" mkdir $DEP_ROOT fi mkdir $REL_DIR exit EOT scp ./dir1 user@server:$REL_DIR scp ./dir2 user@server:$REL_DIR เมื่อใดก็ตามที่ฉันเรียกใช้ฉันได้รับข้อความนี้: Pseudo-terminal will not be allocated because stdin is not a terminal. และสคริปต์ก็หยุดตลอดไป กุญแจสาธารณะของฉันเชื่อถือได้บนเซิร์ฟเวอร์และฉันสามารถเรียกใช้คำสั่งทั้งหมดนอกสคริปต์ได้ดี …
345 linux  bash  shell  ssh 

30
วิธีรับที่อยู่ IP หลักของเครื่องในระบบบน Linux และ OS X [ปิด]
ปิด. คำถามนี้ไม่เป็นไปตามหลักเกณฑ์กองมากเกิน ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้เป็นไปตามหัวข้อสำหรับ Stack Overflow ปิดเมื่อปีที่แล้ว ปรับปรุงคำถามนี้ ฉันกำลังมองหาโซลูชันบรรทัดคำสั่งที่จะส่งคืนที่อยู่ IP หลัก (แรก) ของ localhost นอกเหนือจาก 127.0.0.1 โซลูชันควรทำงานอย่างน้อยสำหรับ Linux (Debian และ RedHat) และ OS X 10.7+ ฉันทราบว่าifconfigมีให้ทั้งสองแบบ แต่ผลลัพธ์ไม่สอดคล้องกันระหว่างแพลตฟอร์มเหล่านี้
339 bash  unix  ip  ifconfig 

8
ฉันจะระบุรหัสผ่านเป็น 'psql' แบบไม่โต้ตอบได้อย่างไร
ฉันพยายามที่จะทำให้กระบวนการสร้างฐานข้อมูลที่มีสคริปต์เชลล์และสิ่งหนึ่งที่ผมเคยตีบล็อกถนนที่มีการส่งผ่านรหัสผ่านเพื่อpsql นี่คือรหัสเล็กน้อยจากเชลล์สคริปต์: psql -U $DB_USER -h localhost -c"$DB_RECREATE_SQL" ฉันจะส่งรหัสผ่านไปยังpsqlวิธีที่ไม่โต้ตอบได้อย่างไร

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