Sorun izle çalıştırıldığında çalışır shve 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 shve 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. watchkomutlarını /bin/shsisteminizde 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 func1bir senaryoyu tek başına koymak ve bu senaryoyu çağırmaktır.
Kısacası, şunu deneyin:
watch bash -c func1
.bash_profile
.bash_profiledosyanın nispeten boş olduğu bir ortamda işleri izlemek için harika bir komuttur . Ancak, benim .bash_aliasesdosya ( benim kaynaklı.bashrc ) olan bir takma ad çalıştırmak istedim , bu yüzden -ibash 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-funcBenim için sadece Ubuntu Server 16.04'te çalışın - diğerleri ise çalışmıyor.
İçin varsayılan kabuk watcholduğ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/shiçin /bin/bash(veya mevcut kabuk) o zaman talimat verebilirsiniz watchkullanarak kabuk exec -xya --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/shbashbash
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-funcevet bu benim için Ubuntu Server 16.04 üzerinde çalışıyor - diğerleri değil. Bir ton teşekkürler!
Neden watchsenaryonuzun 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