คำถามติดแท็ก shell-script

คำถามเกี่ยวกับเชลล์สคริปต์ไฟล์เรียกทำงานที่ตีความโดยเชลล์ (bash, zsh ฯลฯ )

3
Shebang เริ่มต้นด้วย `// '?
ฉันสับสนเกี่ยวกับการติดตามสคริปต์ ( hello.go) //usr/bin/env go run $0 $@ ; exit package main import "fmt" func main() { fmt.Printf("hello, world\n") } มันสามารถดำเนินการ (บน MacOS X 10.9.5) $ chmod +x hello.go $ ./hello.go hello, world ฉันไม่เคยได้ยินเกี่ยวกับ shebang //มาก่อนเลย และมันก็ยังทำงานได้เมื่อฉันแทรกบรรทัดว่างที่ด้านบนของสคริปต์ เหตุใดสคริปต์นี้จึงทำงาน

3
ทำความเข้าใจกับ“ IFS = read -r line”
ฉันเข้าใจชัดเจนว่าสามารถเพิ่มค่าให้กับตัวแปรตัวคั่นฟิลด์ภายในได้ ตัวอย่างเช่น: $ IFS=blah $ echo "$IFS" blah $ ฉันยังเข้าใจว่าread -r lineจะบันทึกข้อมูลจากstdinไปยังชื่อตัวแปรline: $ read -r line <<< blah $ echo "$line" blah $ อย่างไรก็ตามคำสั่งสามารถกำหนดค่าตัวแปรได้อย่างไร และเก็บข้อมูลจากstdinตัวแปรแรกlineแล้วให้ค่าของlineถึงIFSหรือไม่?

12
เหตุใดจึงต้องเขียนสคริปต์ทุบตีทั้งหมดในฟังก์ชั่น
ที่ทำงานฉันเขียนสคริปต์ทุบตีบ่อยๆ หัวหน้างานของฉันแนะนำว่าสคริปต์ทั้งหมดจะถูกแบ่งเป็นฟังก์ชั่นคล้ายกับตัวอย่างต่อไปนี้: #!/bin/bash # Configure variables declare_variables() { noun=geese count=three } # Announce something i_am_foo() { echo "I am foo" sleep 0.5 echo "hear me roar!" } # Tell a joke walk_into_bar() { echo "So these ${count} ${noun} walk into a bar..." } # Emulate a pendulum clock for a …

6
ความแตกต่างระหว่าง ls -l และ ll?
ฉันค่อนข้างใหม่ในการเขียนโปรแกรมเป็นทั้งบทเรียนและบางส่วนได้รับการบอกให้ผมใช้ls -lจะมองไปที่ไฟล์ในไดเรกทอรีและคนอื่น ๆ llได้รับการพูด ฉันรู้ว่าlsเป็นรายการสั้น ๆ แต่มีความแตกต่างระหว่างอีกสองคนหรือไม่
59 shell  shell-script  ls 

4
มาตรฐานสำหรับการเยื้องในเชลล์สคริปต์คืออะไร [ปิด]
ชุมชน Java ใช้ 4 ช่องว่างเป็นหน่วยของการย่อหน้า 1 ชุมชน Ruby ใช้ 2 ช่องว่างที่ตกลงกันโดยทั่วไป 2 มาตรฐานสำหรับการเยื้องในเชลล์สคริปต์คืออะไร 2 หรือ 4 ช่องว่างหรือ 1 แท็บ?

4
รับเส้นทางของสคริปต์ปัจจุบันเมื่อดำเนินการผ่าน symlink
ฉันมียูทิลิตี้ที่ประกอบด้วยไดเรกทอรีคู่ที่มีสคริปต์ทุบตีและไฟล์สนับสนุนที่จะนำไปใช้กับเครื่องหลายเครื่องในไดเรกทอรีที่แตกต่างกันในแต่ละเครื่อง สคริปต์ต้องสามารถอ้างอิงพา ธ ที่สัมพันธ์กับตัวเองดังนั้นฉันจึงต้องสามารถรับพา ธ ไปยังไฟล์ที่ถูกเรียกใช้งานในปัจจุบัน ฉันรู้dirname $0สำนวนที่ใช้งานได้อย่างสมบูรณ์แบบเมื่อสคริปต์ของฉันถูกเรียกใช้โดยตรง น่าเสียดายที่มีความปรารถนาที่จะสามารถสร้างการเชื่อมโยงไปยังสคริปต์เหล่านี้จากไดเรกทอรีที่แตกต่างกันโดยสิ้นเชิงและยังคงมีการทำงานแบบลอจิกการทำเส้นทางแบบสัมพัทธ์ ตัวอย่างของโครงสร้าง driectory โดยรวมมีดังนี้: / |-usr/local/lib | |-foo | | |-bin | | | |-script.sh | | |-res | | | |-resource_file.txt |-home/mike/bin | |-link_to_script (symlink to /usr/local/lib/foo/bin/script.sh) ฉันจะอ้างอิงอย่างน่าเชื่อถือได้/usr/local/lib/foo/res/resource_file.txtจากscript.shว่ามันถูกเรียกโดย/usr/local/lib/foo/bin/script.shหรือ~mike/bin/link_to_script?

6
แสดงปีขณะที่แสดงรายการไฟล์ในไดเรกทอรีปัจจุบัน
ฉันกำลังทำงานบนเซิร์ฟเวอร์ Red Hat คำสั่งls -lหรือให้ฉันวันที่และเวลาในรูปแบบll+"%b %-d %H:%M" ฉันต้องการแสดงรายการไฟล์ในลักษณะที่ปีที่ไฟล์แต่ละไฟล์ถูกสร้างขึ้นจะปรากฏขึ้นภายในวันที่ เป็นไปได้อย่างไร?

3
ฉันจะระงับเอาต์พุตจาก grep ได้อย่างไรเพื่อให้ส่งคืนสถานะออกเท่านั้น
ฉันมีgrepคำสั่ง ฉันกำลังค้นหาคำหลักจากไฟล์ แต่ไม่ต้องการแสดงผลลัพธ์ grepผมแค่อยากจะรู้ว่าออกจากสถานะของ

6
ฉันจะได้รับทุบตีเพื่อออกจากความล้มเหลว backtick ในลักษณะที่คล้ายกับ pipefail ได้อย่างไร
ดังนั้นฉันชอบที่จะทำให้สคริปต์ทุบตีของฉันแข็งขึ้นทุกที่ที่ฉันสามารถทำได้ (และเมื่อไม่สามารถมอบหมายให้เป็นภาษาเช่น Python / Ruby) เพื่อให้แน่ใจว่าข้อผิดพลาดจะไม่หายไป ในหลอดเลือดดำนั้นฉันมีเคร่งครัด. sh ซึ่งมีสิ่งต่าง ๆ เช่น: set -e set -u set -o pipefail และแหล่งที่มาในสคริปต์อื่น ๆ อย่างไรก็ตามในขณะที่ pipefail จะรับ: false | echo it kept going | true มันจะไม่รับ: echo The output is '`false; echo something else`' ผลลัพธ์จะเป็น ผลลัพธ์คือ '' False ส่งคืนสถานะที่ไม่เป็นศูนย์และไม่มีการ stdout ในไปป์มันจะล้มเหลว แต่ที่นี่ไม่มีข้อผิดพลาดเกิดขึ้น เมื่อนี่เป็นการคำนวณที่เก็บไว้ในตัวแปรจริงในภายหลังและตั้งค่าเป็นค่าว่างนี่อาจทำให้เกิดปัญหาในภายหลัง ดังนั้น …

10
bash: ทดสอบว่า $ WORD อยู่ในชุดหรือไม่
ฉันกำลังมองหาโครงสร้างในbashการตัดสินใจว่าตัวแปร$WORDเป็นหนึ่งในคำที่กำหนด ฉันต้องการสิ่งนี้: if "$WORD" in dog cat horse ; then echo yes else echo no fi ทุบตีมีโครงสร้างเช่นนี้? ถ้าไม่สิ่งที่จะใกล้เคียงที่สุด?

6
วิธีที่ดีที่สุดในการติดตามบันทึกและดำเนินการคำสั่งเมื่อมีข้อความปรากฏในบันทึก
ฉันมีบันทึกเซิร์ฟเวอร์ที่แสดงบรรทัดข้อความเฉพาะลงในไฟล์บันทึกเมื่อเซิร์ฟเวอร์หยุดทำงาน ฉันต้องการรันคำสั่งเมื่อเซิร์ฟเวอร์ทำงานและด้วยเหตุนี้ให้ทำสิ่งต่อไปนี้: tail -f /path/to/serverLog | grep "server is up" ...(now, e.g., wget on server)? วิธีที่ดีที่สุดในการทำเช่นนี้คืออะไร?

6
การเชื่อมโยงสองตัวแปรเข้ากับขีดล่าง
ฉันต้องต่อตัวแปรสองตัวเข้าด้วยกันเพื่อสร้างชื่อไฟล์ที่มีเครื่องหมายขีดล่าง ให้เรียกตัวแปรของฉัน$FILENAMEและ$EXTENSIONอ่านชื่อไฟล์จากไฟล์ FILENAME=Hello EXTENSION=WORLD.txt ตอนนี้ ... ฉันได้ลองทำสิ่งต่อไปนี้โดยไม่ประสบความสำเร็จ: NAME=${FILENAME}_$EXTENSION NAME=${FILENAME}'_'$EXTENSION NAME=$FILENAME\\_$EXTENSION ฉันมักจะได้ผลลัพธ์ที่แปลก ๆ โดยทั่วไปแล้วจะขีดเส้นใต้ก่อน ฉันต้องการมัน echo $NAME Hello_WORLD.txt

5
การแยกสตริงโดยการเกิดขึ้นครั้งแรกของตัวคั่น
ฉันมีสตริงในรูปแบบถัดไป id;some text here with possible ; inside และต้องการที่จะแยกมันถึง 2 ;สายโดยเกิดขึ้นครั้งแรกของ ดังนั้นควร: idและsome text here with possible ; inside ฉันรู้วิธีแยกสตริง (ตัวอย่างเช่นด้วยcut -d ';' -f1) แต่มันจะแยกส่วนเพิ่มเติมเนื่องจากฉันมี;อยู่ในส่วนด้านซ้าย

3
ฉันจะทำให้ตัวแปรสภาพแวดล้อม“ ส่งออก” ใน shell script ติดรอบได้อย่างไร
ฉันมีบัญชี Amazon EC2 หลายบัญชีและต้องการเปลี่ยนตัวแปรอย่างรวดเร็วเช่นการ$EC2_HOMEใช้สคริปต์ ฉันได้ตั้งค่าสคริปต์เชลล์เช่นนี้: #!/bin/sh export EC2_HOME=/home/me/.ec2 echo $EC2_HOME เมื่อฉันเรียกใช้สคริปต์ฉันรู้ว่าEC2_HOMEมีการตั้งค่า แต่ฉันคิดว่าการใช้exportจะทำให้ตัวแปรติดรอบหลังจากสคริปต์เสร็จสมบูรณ์ มันไม่ได้ทำงานเหมือนecho $EC_HOMEไม่แสดงอะไรเลย ฉันรู้ว่านี่ต้องเป็นความรู้พื้นฐานเกี่ยวกับการเขียนสคริปต์ Linux แต่ฉันไม่รู้ ฉันพยายามหาคำถามที่เกี่ยวข้องโดยไม่มีโชค - ดังนั้นฉันจึงขอโทษถ้ามันซ้ำกัน

5
วิธีกำหนดและโหลดฟังก์ชันเชลล์ของคุณเองใน zsh
ฉันมีช่วงเวลาที่ยากลำบากในการกำหนดและเรียกใช้ฟังก์ชันเชลล์ของฉันเองใน zsh ฉันทำตามคำแนะนำในเอกสารอย่างเป็นทางการและลองใช้ตัวอย่างง่ายๆก่อน แต่ฉันไม่สามารถทำงานได้ ฉันมีโฟลเดอร์: ~/.my_zsh_functions ในโฟลเดอร์นี้ฉันมีไฟล์ชื่อที่functions_1มีrwxสิทธิ์ผู้ใช้ ในไฟล์นี้ฉันได้กำหนดฟังก์ชั่นเชลล์ต่อไปนี้: my_function () { echo "Hello world"; } ฉันกำหนดFPATHให้ใส่เส้นทางไปยังโฟลเดอร์~/.my_zsh_functions: export FPATH=~/.my_zsh_functions:$FPATH ฉันสามารถยืนยันได้ว่าโฟลเดอร์.my_zsh_functionsอยู่ในเส้นทางของฟังก์ชั่นด้วยecho $FPATHหรือecho $fpath อย่างไรก็ตามถ้าฉันลองทำสิ่งต่อไปนี้จากเชลล์: > autoload my_function > my_function ฉันเข้าใจ: zsh: my_test_function: ไม่พบไฟล์การกำหนดฟังก์ชัน มีอะไรอีกบ้างที่ฉันต้องทำเพื่อให้สามารถโทรได้my_function? ปรับปรุง: คำตอบเพื่อให้ห่างไกลแนะนำการจัดหาไฟล์ด้วยฟังก์ชั่น zsh มันสมเหตุสมผลแล้ว แต่ฉันก็สับสนเล็กน้อย zsh ไม่ควรรู้ว่าไฟล์เหล่านั้นอยู่FPATHที่ไหน? ตอนนั้นมีจุดประสงค์autoloadอะไร?
54 shell-script  zsh 

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