Cara memaksa menonton berjalan di bawah bash

18

Masalahnya adalah bahwa ketika arloji dijalankan, arloji berjalan shdan saya mendapatkan kesalahan ini:

sh: 1: func1: not found

ini kodenya:

#!/bin/bash

func1(){
  echo $1
}

export -f func1

watch func1
Rachid Oussanaa
sumber
Bisakah Anda memberikan perintah apa yang sebenarnya Anda jalankan?
cuonglm
@ Gnouc bukannya echo $ 1 saya punya skrip agak panjang jadi saya tidak tahu ..
Rachid Oussanaa
Maksud saya bagaimana Anda menjalankan perintah ssh Anda?
cuonglm
@Gnouc ./bin/myfunc.sh
Rachid Oussanaa

Jawaban:

10

Oke, jadi ada beberapa masalah dengan pendekatan Anda.

Anda mengekspor fungsi, yang tidak mudah dibawa di antara shell. watchmengeksekusi perintahnya dengan /bin/sh, yang pada sistem Anda tidak bash. Dan apa pun shellnya, itu tidak menghormati fungsi ekspor, jadi Anda mendapatkan kesalahan.

Kedua, Anda dapat mengubah perintah Anda menjadi sesuatu seperti watch bash -c 'func1', tetapi ini mungkin tidak bekerja dengan baik.
Alasannya di sini adalah bahwa variabel apa pun yang ditetapkan oleh skrip tidak akan tersedia untuk fungsi tersebut. Anda mungkin dapat mengekspor yang dibutuhkan, tetapi mulai berantakan.

Solusi teraman adalah memasukkan func1skrip sendiri dan memanggil skrip itu.
 

Singkatnya, coba:

watch bash -c func1
Patrick
sumber
1
Ini adalah CPU intensif dalam hal fungsi didefinisikan dalam.bash_profile
VarunAgw
@ VarunAgw, itu poin yang bagus. Namun, ini adalah perintah yang bagus untuk memantau hal-hal di lingkungan di mana .bash_profilefile tersebut relatif kosong. Namun, saya memang ingin menjalankan alias yang ada di .bash_aliasesfile saya ( bersumber dari saya.bashrc ), jadi saya akhirnya menambahkan -iflag ke bash juga. Saya pikir itu mungkin membantu seseorang:watch bash -ic "func1; alias1; func2; …"
aaiezza
Hanya watch -x bash -c my-funcberfungsi untuk saya di Ubuntu Server 16.04 - sementara yang lain tidak.
Nam G VU
14

Shell default untuk watchadalah /bin/sh. Shell tidak akan mewarisi variabel atau fungsi yang diekspor dari tipe shell lainnya.

Jika sistem Anda tidak terhubung /bin/shke /bin/bash(atau shell Anda saat ini) maka Anda dapat menginstruksikan watchuntuk mengeksekusi shell Anda dengan menggunakan -xatau --exec:

watch -x bash -c "my_func"

atau

watch --exec bash -c "my_func"

Ini berbeda dengan watch bash -c "test_watch"(tidak termasuk --exec) karena tidak digunakan /bin/shuntuk menelurkan proses anak (dalam hal ini, bash), mempertahankan bashsemua jalan. Seperti diabaikan dalam jawaban lain, ini bisa berantakan jika mengekspor fungsi yang sangat digabungkan ke lingkungan saat ini (yaitu membutuhkan variabel atau fungsi lain).


Sebuah contoh:

test_watch() { echo 'Working!'; }
export -f test_watch
watch --exec bash -c "test_watch"

memberi yang akrab

Every 2.0s: bash -c test_watch                                   Thu Mar 31 11:15:56 2016

Working!
Andy
sumber
Hanya watch -x bash -c my-funcya ini bekerja untuk saya di Ubuntu Server 16.04 - sementara yang lain tidak. Terima kasih banyak!
Nam G VU
4

Mengapa lari watchdari dalam skrip Anda? Mengapa tidak memiliki skrip shell ini:

$ cat func1 
#!/bin/bash

func1(){
  echo $1
}

func1 $1

... dan kemudian jalankan seperti itu ...

$ watch func1 foo
Kriket Merah
sumber