ปัญหาคือเมื่อมีการใช้งานนาฬิกามันทำงาน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