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

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

5
แยกความแตกต่างระหว่างการรันและการซอร์สในสคริปต์เชลล์ bash หรือไม่?
ไม่ว่าฉันจะขออะไรจากที่นี่เป็นเรื่องแปลกแหกคอก / ไม่เป็นทางการ / มีความเสี่ยงหรือทักษะ Google-fu ของฉันไม่ได้ขึ้นอยู่กับว่า ... ในbashเชลล์สคริปต์มีวิธีใดที่จะบอกได้ง่ายว่าเชลล์สคริปต์นั้นมาจากแหล่งอื่นหรือไม่? กล่าวอีกนัยหนึ่งเป็นไปได้ไหมที่จะแยกแยะระหว่างพฤติกรรมสองอย่างต่อไปนี้? # from another shell script source myScript.sh # from command prompt, or another shell script ./myScript.sh สิ่งที่ฉันกำลังคิดที่จะทำคือการสร้างเชลล์สคริปต์แบบยูทิลิตี้ที่มีbashฟังก์ชั่นที่สามารถให้บริการได้เมื่อมีที่มา แม้ว่าสคริปต์นี้จะถูกเรียกใช้ด้วยตัวเองฉันก็อยากให้มันทำงานบางอย่างตามหน้าที่ที่กำหนดไว้เช่นกัน มีตัวแปรสภาพแวดล้อมบางชนิดที่เชลล์สคริปต์นี้สามารถรับได้เช่น some_function() { # ... } if [ -z "$IS_SOURCED" ]; then some_function; fi โดยเฉพาะอย่างยิ่งฉันกำลังมองหาโซลูชันที่ไม่ต้องการสคริปต์ผู้โทรเพื่อตั้งค่าตัวแปรสถานะใด ๆ แก้ไข : ฉันทราบความแตกต่างระหว่างการจัดหาและการเรียกใช้สคริปต์สิ่งที่ฉันพยายามค้นหาที่นี่หากเป็นไปได้ที่จะบอกความแตกต่างในสคริปต์ที่ใช้งานอยู่ (ทั้งสองวิธี)

3
การค้นหาสตริงย่อยแบบคำนึงถึงขนาดตัวพิมพ์ในเชลล์สคริปต์ [ปิด]
ปิด คำถามนี้ต้องการรายละเอียดหรือความคมชัด ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ เพิ่มรายละเอียดและชี้แจงปัญหาโดยแก้ไขโพสต์นี้ ปิดให้บริการใน5 ปีที่ผ่านมา ฉันจะเขียนเชลล์สคริปต์ที่จะทำการจับคู่สตริงย่อยที่ไม่ตรงตามตัวพิมพ์เล็กและใหญ่ของเอาต์พุตคำสั่งได้อย่างไร?


3
ใช้ grep ในคำสั่งเงื่อนไขในทุบตี
ฉันยังใหม่ต่อการเขียนสคริปต์ในการทุบตีและลองทำในสิ่งที่ฉันคิดว่าจะเป็นสิ่งพื้นฐาน ฉันต้องการเรียกใช้ DDNS ที่อัปเดตจากเซิร์ฟเวอร์ของฉันที่ใช้ Ubuntu 14.04 ยืมรหัสจาก dnsimple นี่คือสิ่งที่ฉันมี: #!/bin/bash LOGIN="email" TOKEN="token" DOMAIN_ID="domain" RECORD_ID="record" IP=`curl -s http://icanhazip.com/` OUTPUT=` curl -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "X-DNSimple-Domain-Token: $TOKEN" \ -X "PUT" \ -i "https://api.dnsimple.com/v1/domains/$DOMAIN_ID/records/$RECORD_ID" \ -d "{\"record\":{\"content\":\"$IP\"}}"` if ! echo "$OUTPUT" | grep -q "(Status:\s200)"; then echo "match" …

2
เหตุใดแบ็กสแลชจึงรวมอยู่ในเชลล์สคริปต์นี้
ในสำเนาconda.shสคริปต์ของฉันฉันเห็นบรรทัดต่อไปนี้: if [ -n "${_CE_CONDA}" ] && [ -n "${WINDIR+x}" ]; then SYSP=$(\dirname "${CONDA_EXE}") else SYSP=$(\dirname "${CONDA_EXE}") SYSP=$(\dirname "${SYSP}") fi ผมอยากรู้ว่าทำไมถึงมีการทับขวาในด้านหน้าในd dirnameฉันไม่เชื่อว่ามีความจำเป็น การใช้แบ็กสแลชนี้ปรากฏในที่อื่นในไฟล์ต้นฉบับ มีเหตุผลในการทำสิ่งนี้ที่ฉันหายไปหรือไม่?

10
Shell: เป็นไปได้ไหมที่จะชะลอคำสั่งโดยไม่ใช้ `sleep '?
มีการทดแทนทางเลือกหรือเทคนิคทุบตีสำหรับการชะลอคำสั่งโดยไม่ใช้sleepหรือไม่? ตัวอย่างเช่นการแสดงคำสั่งด้านล่างโดยไม่ใช้สลีปจริง: $ sleep 10 && echo "This is a test"

2
มีวิธี POSIX ในการตั้งค่าอาร์กิวเมนต์ zeroth ของแอปพลิเคชันเป้าหมายหรือไม่?
ในbashคุณสามารถใช้exec -aและzshคุณสามารถผลัดกันยังตั้งARGV0ในการรันโปรแกรมที่มีการโต้แย้งข้อที่ศูนย์บาง แต่มียังเป็นวิธีที่ POSIX ของการทำเพื่อ? ตามที่แนะนำในความคิดเห็นนี้คุณสามารถสร้างลิงก์สัญลักษณ์ (ชั่วคราว) เพื่อให้ได้สิ่งนี้ แต่วิธีนี้ฉันไม่สามารถตั้งค่าอาร์กิวเมนต์ zeroth ใหม่ให้เป็นค่าใดก็ได้ตามอำเภอใจเช่นคำสั่งที่มีเส้นทางแน่นอน มีวิธีอื่นอีกไหม?

2
ฮาร์ดลิงก์นับเป็นไฟล์ปกติหรือไม่
ฉันสงสัยว่ามีวิธีในการลงทะเบียนหรือไม่ แต่เนื่องจากเครื่องมือค้นหาที่ทันสมัยส่วนใหญ่ทำงานได้ไม่ดีกับวลีที่มีความยาวประมาณ 5 คำฉันจึงต้องการความช่วยเหลือในส่วนนี้ ฉันสงสัยสิ่งนี้เพราะฉันกำลังสร้างสคริปต์ทุบตีที่ต้องลงทะเบียนไฟล์เป็นบางประเภทและตัดสินใจตามนั้น เทคนิคนี้ไม่สำคัญกับโครงการของฉัน แต่ฉันอยากรู้ นอกจากนี้หากไฟล์เหล่านั้นถูกพิจารณาว่าเป็นไฟล์ปกติก็มีวิธีตรวจสอบว่าไฟล์เหล่านี้เชื่อมโยงกันอย่างหนักหรือไม่โดยไม่ต้องแยกวิเคราะห์ls -i? และมีวิธีการตรวจสอบว่าไฟล์โดยพลการบางไฟล์, X, เชื่อมโยงกับไฟล์โดยพลการอื่น ๆ , Y, โดยไม่ใช้find -iคำสั่งหรือไม่?

1
ทำไมฟังก์ชั่นจะไม่กลับมาจนกว่ากระบวนการพื้นหลังจะสิ้นสุด
พิจารณาสคริปต์นี้: #!/bin/bash function start { leafpad & echo $! } PID=$(start) echo "PID is $PID" สคริปต์ไม่ดำเนินการผ่านวงเล็บปีกกาปิดจนกว่ากระบวนการ leafpad จะสิ้นสุดลงแม้ว่าจะเป็นกระบวนการพื้นหลัง ทำไมนี้ เป็นไปได้หรือไม่ที่จะเริ่มกระบวนการพื้นหลังจากฟังก์ชั่น?

2
Cron job ลบไฟล์ที่เก่ากว่า 3 วัน
ฉันต้องลบไฟล์ที่เก่ากว่า 3 วันด้วยงาน cron ใน 3 ไดเรกทอรีที่แตกต่างกัน (ทั้ง 3 ไดเรกทอรีนี้เป็นรายการย่อยของไดเรกทอรีหลัก/a/b/c/1& /a/b/c/2& /a/b/c/3) สามารถทำได้ด้วยหนึ่งบรรทัดใน crontab หรือไม่

3
ฉันจะค้นหาหมายเลขบรรทัดใน Bash เมื่อเกิดข้อผิดพลาดได้อย่างไร
คุณจะค้นหาหมายเลขบรรทัดใน Bash ที่เกิดข้อผิดพลาดได้อย่างไร ตัวอย่าง ฉันสร้างสคริปต์ง่าย ๆ ต่อไปนี้พร้อมหมายเลขบรรทัดเพื่ออธิบายสิ่งที่เราต้องการ สคริปต์จะคัดลอกไฟล์จาก cp $file1 $file2 cp $file3 $file4 เมื่อหนึ่งในcpคำสั่งล้มเหลวแล้วฟังก์ชั่นจะออกกับทางออกที่ 1 เราต้องการเพิ่มความสามารถให้กับฟังก์ชันเพื่อพิมพ์ข้อผิดพลาดด้วยหมายเลขบรรทัด (ตัวอย่างเช่น 8 หรือ 12) เป็นไปได้ไหม สคริปต์ตัวอย่าง 1 #!/bin/bash 2 3 4 function in_case_fail { 5 [[ $1 -ne 0 ]] && echo "fail on $2" && exit 1 6 } 7 8 cp …

3
ฉันจะขยายตัวแปรที่ยกมาเป็นอะไรถ้ามันว่างเปล่า?
ว่าฉันมีสคริปต์ทำ: some-command "$var1" "$var2" ... และในกรณีที่var1ว่างเปล่าฉันอยากจะแทนที่ด้วยไม่มีอะไรแทนที่สตริงว่างดังนั้นคำสั่งที่ดำเนินการคือ: some-command "$var2" ... และไม่: some-command '' "$var2" ... มีวิธีที่ง่ายกว่าการทดสอบตัวแปรและเงื่อนไขรวมถึงมันได้หรือไม่ if [ -n "$1" ]; then some-command "$var1" "$var2" ... # or some variant using arrays to build the command # args+=("$var1") else some-command "$var2" ... fi มีการทดแทนพารามิเตอร์มากกว่าที่สามารถขยายไปเป็นอะไรใน bash, zsh หรือไม่ชอบ? ฉันอาจยังต้องการใช้ globbing ในส่วนที่เหลือของข้อโต้แย้งดังนั้นการปิดการใช้งานและการเลิกตัวแปรไม่ได้เป็นตัวเลือก

3
วิธีใช้ inotifywait เพื่อดูไดเร็กทอรีสำหรับการสร้างไฟล์ของส่วนขยายเฉพาะ
ฉันเห็นคำตอบนี้แล้ว คุณควรพิจารณาใช้ inotifywait เป็นตัวอย่าง: inotifywait -m /path -e create -e moved_to | while read path action file; do echo "The file '$file' appeared in directory '$path' via '$action'" # do something with the file done คำถามของฉันคือสคริปต์ข้างต้นดูไดเรกทอรีสำหรับการสร้างไฟล์ทุกประเภท แต่ฉันจะแก้ไขinotifywaitคำสั่งเพื่อรายงานได้เฉพาะเมื่อไฟล์ประเภท / นามสกุลที่แน่นอนถูกสร้างขึ้น (หรือย้ายไปยังไดเรกทอรี) - เช่นควร รายงานเมื่อ.xmlมีการสร้างไฟล์ใด ๆ ฉันลองอะไร: ฉันรันinotifywait --helpคำสั่งแล้วและอ่านตัวเลือกบรรทัดคำสั่ง มันมี--exclude <pattern>และ--excludei <pattern>คำสั่งในการยกเว้นไฟล์บางประเภท …

8
วิธีใช้ grep และ cut in script เพื่อรับ URL เว็บไซต์จากไฟล์ HTML
ฉันกำลังพยายามใช้ grep และตัดเพื่อแยก URL จากไฟล์ HTML ลิงค์มีลักษณะดังนี้: <a href="http://examplewebsite.com/"> เว็บไซต์อื่น ๆ ที่มี.net, แต่ฉันคิดว่าฉันจะให้ตัดออกจากจุดที่เหมาะสมก่อน.gov >ดังนั้นฉันรู้ว่าฉันสามารถใช้ grep และตัดเพื่อตัดทุกอย่างก่อน http และหลัง. com แต่ฉันติดอยู่ในขณะนี้

13
ฉันจะลบความคิดเห็นทั้งหมดจากไฟล์ได้อย่างไร
ฉันมีไฟล์ที่มีความคิดเห็น: foo bar stuff #Do not show this... morestuff evenmorestuff#Or this ฉันแค่ต้องการพิมพ์รหัสที่ไม่ใส่เครื่องหมายทั้งหมด: foo bar stuff morestuff evenmorestuff ความสามารถในการตัดความคิดเห็นออกจากไฟล์เป็นสิ่งสำคัญ ... วิธีการที่ดีคืออะไร

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