ปัญหาคือเมื่อมีการใช้งานนาฬิกามันทำงานshและฉันได้รับข้อผิดพลาดนี้:
sh: 1: func1: not found
นี่คือรหัส:
#!/bin/bash
func1(){
echo $1
}
export -f func1
watch func1
ปัญหาคือเมื่อมีการใช้งานนาฬิกามันทำงานshและฉันได้รับข้อผิดพลาดนี้:
sh: 1: func1: not found
นี่คือรหัส:
#!/bin/bash
func1(){
echo $1
}
export -f func1
watch func1
คำตอบ:
ตกลงดังนั้นจึงมีปัญหาเล็กน้อยเกี่ยวกับวิธีการของคุณ
คุณกำลังส่งออกฟังก์ชั่นซึ่งไม่สามารถเคลื่อนย้ายได้ระหว่างเชลล์ watchรันคำสั่งด้วยซึ่งในระบบของคุณไม่ได้/bin/sh bashและไม่ว่าเชลล์คืออะไรมันไม่เคารพการเอ็กซ์พอร์ตฟังก์ชันดังนั้นคุณจะได้รับข้อผิดพลาด
ประการที่สองคุณสามารถเปลี่ยนคำสั่งของคุณเป็นแบบwatch bash -c 'func1'นี้ได้ แต่สิ่งนี้อาจทำงานได้ไม่ดีนัก
เหตุผลที่นี่เป็นเพราะตัวแปรใด ๆ ที่สคริปต์กำหนดไว้จะไม่สามารถใช้งานได้ คุณอาจจะสามารถส่งออกสิ่งที่ต้องการได้ แต่มันเริ่มยุ่งเหยิง
ทางออกที่ปลอดภัยที่สุดคือการใส่func1สคริปต์ด้วยตัวเองและเรียกสคริปต์นั้น
ในระยะสั้นลอง:
watch bash -c func1
.bash_profile
.bash_profileไฟล์ค่อนข้างว่างเปล่า อย่างไรก็ตามฉันต้องการเรียกใช้นามแฝงที่อยู่ใน.bash_aliasesไฟล์ของฉัน( ที่มาจากฉัน.bashrc ) ดังนั้นฉันจึงสิ้นสุดการเพิ่มการ-iตั้งค่าสถานะเพื่อทุบตีเช่นกัน ผมคิดว่าอาจจะช่วยคน:watch bash -ic "func1; alias1; func2; …"
watch -x bash -c my-funcงานได้กับฉันใน Ubuntu Server 16.04 เท่านั้น - ในขณะที่บางโปรแกรมไม่ทำงาน
เปลือกเริ่มต้นสำหรับการมีwatch /bin/shเชลล์จะไม่รับสืบทอดตัวแปรหรือฟังก์ชั่นที่ส่งออกจากเชลล์ประเภทอื่น ๆ
หากระบบของคุณไม่เชื่อมโยง/bin/shไปยัง/bin/bash(หรือเชลล์ปัจจุบันของคุณ) จากนั้นคุณสามารถสั่งwatchให้ดำเนินการเชลล์โดยใช้-xหรือ--exec:
watch -x bash -c "my_func"
หรือ
watch --exec bash -c "my_func"
สิ่งนี้แตกต่างจากwatch bash -c "test_watch"(ยกเว้น--exec) เนื่องจากไม่ได้ใช้/bin/shเพื่อวางกระบวนการลูก (ในกรณีนี้bash) โดยคงไว้bashตลอดไป ตามที่ถ้ำไว้ในคำตอบอื่น ๆ สิ่งนี้อาจทำให้ยุ่งเหยิงหากการส่งออกฟังก์ชั่นที่เชื่อมโยงกับสภาพแวดล้อมในปัจจุบัน (เช่นต้องการตัวแปรหรือฟังก์ชั่นอื่น ๆ )
ตัวอย่าง:
test_watch() { echo 'Working!'; }
export -f test_watch
watch --exec bash -c "test_watch"
ช่วยให้คุ้นเคย
Every 2.0s: bash -c test_watch Thu Mar 31 11:15:56 2016
Working!
watch -x bash -c my-funcใช่แค่นี้ใช้ได้กับฉันใน Ubuntu Server 16.04 - ในขณะที่คนอื่นทำไม่ได้ ขอบคุณตัน!
ทำไมต้องทำงานwatchจากภายในสคริปต์ของคุณ? ทำไมไม่มีเชลล์สคริปต์นี้:
$ cat func1
#!/bin/bash
func1(){
echo $1
}
func1 $1
... แล้วเรียกใช้เหมือนกัน ...
$ watch func1 foo