Masalahnya adalah bahwa ketika arloji dijalankan, arloji berjalan sh
dan 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 sh
dan 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. watch
mengeksekusi 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 func1
skrip sendiri dan memanggil skrip itu.
Singkatnya, coba:
watch bash -c func1
.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 menginstruksikan watch
untuk mengeksekusi shell Anda dengan menggunakan -x
atau --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/sh
untuk menelurkan proses anak (dalam hal ini, bash
), mempertahankan bash
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:
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-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:
$ cat func1
#!/bin/bash
func1(){
echo $1
}
func1 $1
... dan kemudian jalankan seperti itu ...
$ watch func1 foo