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
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
Jawaban:
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
.bash_profile
.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; …"
watch -x bash -c my-funcberfungsi untuk saya di Ubuntu Server 16.04 - sementara yang lain tidak.
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!
watch -x bash -c my-funcya ini bekerja untuk saya di Ubuntu Server 16.04 - sementara yang lain tidak. Terima kasih banyak!
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