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.
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).
Jawaban:
Oke, jadi ada beberapa masalah dengan pendekatan Anda.
Anda mengekspor fungsi, yang tidak mudah dibawa di antara shell.
watch
mengeksekusi perintahnya dengan/bin/sh
, yang pada sistem Anda tidakbash
. 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
func1
skrip sendiri dan memanggil skrip itu.Singkatnya, coba:
sumber
.bash_profile
.bash_profile
file tersebut relatif kosong. Namun, saya memang ingin menjalankan alias yang ada di.bash_aliases
file saya ( bersumber dari saya.bashrc
), jadi saya akhirnya menambahkan-i
flag ke bash juga. Saya pikir itu mungkin membantu seseorang:watch bash -ic "func1; alias1; func2; …"
watch -x bash -c my-func
berfungsi untuk saya di Ubuntu Server 16.04 - sementara yang lain tidak.Shell default untuk
watch
adalah/bin/sh
. Shell tidak akan mewarisi variabel atau fungsi yang diekspor dari tipe shell lainnya.Jika sistem Anda tidak terhubung
/bin/sh
ke/bin/bash
(atau shell Anda saat ini) maka Anda dapat menginstruksikanwatch
untuk mengeksekusi shell Anda dengan menggunakan-x
atau--exec
:atau
Ini berbeda dengan
watch bash -c "test_watch"
(tidak termasuk--exec
) karena tidak digunakan/bin/sh
untuk menelurkan proses anak (dalam hal ini,bash
), mempertahankanbash
semua 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:
memberi yang akrab
sumber
watch -x bash -c my-func
ya ini bekerja untuk saya di Ubuntu Server 16.04 - sementara yang lain tidak. Terima kasih banyak!Mengapa lari
watch
dari dalam skrip Anda? Mengapa tidak memiliki skrip shell ini:... dan kemudian jalankan seperti itu ...
sumber