Sorun izle çalıştırıldığında çalışır sh
ve bu hatayı alıyorum:
sh: 1: func1: not found
İşte kod:
#!/bin/bash
func1(){
echo $1
}
export -f func1
watch func1
Sorun izle çalıştırıldığında çalışır sh
ve bu hatayı alıyorum:
sh: 1: func1: not found
İşte kod:
#!/bin/bash
func1(){
echo $1
}
export -f func1
watch func1
Yanıtlar:
Tamam, bu yüzden yaklaşımınızla ilgili birkaç sorun var.
Kabuklar arasında taşınabilir olmayan bir işlevi dışa aktarıyorsunuz. watch
komutlarını /bin/sh
sisteminizde olmayan komutlarla yürütür bash
. Kabuk ne olursa olsun, işlev dışa aktarmalarına saygı duymaz, böylece hatayı alırsınız.
İkincisi, komutunuzu benzer bir şekilde değiştirebilirsiniz watch bash -c 'func1'
, ancak bu da iyi çalışmayabilir.
Bunun nedeni, komut dosyası tarafından ayarlanan değişkenlerin işlev tarafından kullanılamamasıdır. İhtiyacı olanları dışa aktarabilirsiniz, ancak bu dağınık olmaya başlar.
En güvenli çözüm func1
bir senaryoyu tek başına koymak ve bu senaryoyu çağırmaktır.
Kısacası, şunu deneyin:
watch bash -c func1
.bash_profile
.bash_profile
dosyanın nispeten boş olduğu bir ortamda işleri izlemek için harika bir komuttur . Ancak, benim .bash_aliases
dosya ( benim kaynaklı.bashrc
) olan bir takma ad çalıştırmak istedim , bu yüzden -i
bash için bayrak ekleyerek sona erdi . Bunun birine yardım edebileceğini düşündüm:watch bash -ic "func1; alias1; func2; …"
watch -x bash -c my-func
Benim için sadece Ubuntu Server 16.04'te çalışın - diğerleri ise çalışmıyor.
İçin varsayılan kabuk watch
olduğunu /bin/sh
. Kabuklar, dışa aktarılan değişkenleri veya işlevleri diğer kabuk türlerinden devralmaz.
Sistem sembolik bir link vermezse /bin/sh
için /bin/bash
(veya mevcut kabuk) o zaman talimat verebilirsiniz watch
kullanarak kabuk exec -x
ya --exec
:
watch -x bash -c "my_func"
veya
watch --exec bash -c "my_func"
Bu, çocuk sürecini (bu durumda ) ortaya çıkarmak için kullanmadığı için watch bash -c "test_watch"
(hariç --exec
) farklıdır ve tüm yolu korur . Diğer cevaplarda uyarıldığı gibi, mevcut ortama yüksek derecede bağlı işlevlerin dışa aktarılması durumunda dağınık olabilir (diğer değişkenler veya işlevler gerektirir)./bin/sh
bash
bash
Bir örnek:
test_watch() { echo 'Working!'; }
export -f test_watch
watch --exec bash -c "test_watch"
tanıdık verir
Every 2.0s: bash -c test_watch Thu Mar 31 11:15:56 2016
Working!
watch -x bash -c my-func
evet bu benim için Ubuntu Server 16.04 üzerinde çalışıyor - diğerleri değil. Bir ton teşekkürler!
Neden watch
senaryonuzun içinden kaçıyorsunuz? Neden bu kabuk betiğine sahip değilsiniz:
$ cat func1
#!/bin/bash
func1(){
echo $1
}
func1 $1
... ve sonra böyle çalıştırın ...
$ watch func1 foo