Saati bash altında çalışmaya zorlama


18

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

Gerçekte hangi komutu verdiğinizi verebilir misiniz?
cuonglm

Yankı yerine @Gnouc $ 1 biraz uzun senaryom var, bu yüzden bilmiyorum ..
Rachid Oussanaa

Yani ssh komutunu nasıl çalıştırdın?
cuonglm

@Gnouc ./bin/myfunc.sh
Rachid Oussanaa

Yanıtlar:


10

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

1
Fonksiyonun tanımlandığı durumlarda çok CPU yoğundur.bash_profile
VarunAgw

@VarunAgw, bu iyi bir nokta. Ancak, .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; …"
aaiezza

watch -x bash -c my-funcBenim için sadece Ubuntu Server 16.04'te çalışın - diğerleri ise çalışmıyor.
Nam G VU

14

İç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!

Sadece 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!
Nam G VU

4

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.