วิธีบังคับให้นาฬิกาทำงานภายใต้การทุบตี


18

ปัญหาคือเมื่อมีการใช้งานนาฬิกามันทำงานshและฉันได้รับข้อผิดพลาดนี้:

sh: 1: func1: not found

นี่คือรหัส:

#!/bin/bash

func1(){
  echo $1
}

export -f func1

watch func1

คุณให้คำสั่งที่คุณใช้จริง ๆ ได้ไหม?
cuonglm

@Gnouc แทน echo $ 1 ฉันมีสคริปต์ยาวหน่อยดังนั้นฉันไม่รู้ ..
Rachid Oussanaa

ฉันหมายถึงคุณเรียกใช้คำสั่ง ssh ของคุณได้อย่างไร
cuonglm

@Gnouc ./bin/myfunc.sh
Rachid Oussanaa

คำตอบ:


10

ตกลงดังนั้นจึงมีปัญหาเล็กน้อยเกี่ยวกับวิธีการของคุณ

คุณกำลังส่งออกฟังก์ชั่นซึ่งไม่สามารถเคลื่อนย้ายได้ระหว่างเชลล์ watchรันคำสั่งด้วยซึ่งในระบบของคุณไม่ได้/bin/sh bashและไม่ว่าเชลล์คืออะไรมันไม่เคารพการเอ็กซ์พอร์ตฟังก์ชันดังนั้นคุณจะได้รับข้อผิดพลาด

ประการที่สองคุณสามารถเปลี่ยนคำสั่งของคุณเป็นแบบwatch bash -c 'func1'นี้ได้ แต่สิ่งนี้อาจทำงานได้ไม่ดีนัก
เหตุผลที่นี่เป็นเพราะตัวแปรใด ๆ ที่สคริปต์กำหนดไว้จะไม่สามารถใช้งานได้ คุณอาจจะสามารถส่งออกสิ่งที่ต้องการได้ แต่มันเริ่มยุ่งเหยิง

ทางออกที่ปลอดภัยที่สุดคือการใส่func1สคริปต์ด้วยตัวเองและเรียกสคริปต์นั้น
 

ในระยะสั้นลอง:

watch bash -c func1

1
มันเป็น CPU ที่เข้มข้นมากในกรณีที่ฟังก์ชั่นถูกกำหนดใน.bash_profile
VarunAgw

@VarunAgw นั่นเป็นจุดที่ดี อย่างไรก็ตามมันเป็นคำสั่งที่ดีสำหรับการตรวจสอบสิ่งต่าง ๆ ในสภาพแวดล้อมที่.bash_profileไฟล์ค่อนข้างว่างเปล่า อย่างไรก็ตามฉันต้องการเรียกใช้นามแฝงที่อยู่ใน.bash_aliasesไฟล์ของฉัน( ที่มาจากฉัน.bashrc ) ดังนั้นฉันจึงสิ้นสุดการเพิ่มการ-iตั้งค่าสถานะเพื่อทุบตีเช่นกัน ผมคิดว่าอาจจะช่วยคน:watch bash -ic "func1; alias1; func2; …"
aaiezza

ใช้watch -x bash -c my-funcงานได้กับฉันใน Ubuntu Server 16.04 เท่านั้น - ในขณะที่บางโปรแกรมไม่ทำงาน
Nam G VU

14

เปลือกเริ่มต้นสำหรับการมี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 - ในขณะที่คนอื่นทำไม่ได้ ขอบคุณตัน!
Nam G VU

4

ทำไมต้องทำงานwatchจากภายในสคริปต์ของคุณ? ทำไมไม่มีเชลล์สคริปต์นี้:

$ cat func1 
#!/bin/bash

func1(){
  echo $1
}

func1 $1

... แล้วเรียกใช้เหมือนกัน ...

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