Wie man die Uhr zwingt, unter Druck zu laufen


18

Das Problem ist, dass beim Ausführen von watch der folgende shFehler auftritt:

sh: 1: func1: not found

Hier ist der Code:

#!/bin/bash

func1(){
  echo $1
}

export -f func1

watch func1

Können Sie angeben, welchen Befehl Sie tatsächlich ausführen?
Donnerstag,

@ Gnouc statt Echo $ 1 Ich habe ein bisschen langes Skript, damit ich nicht weiß ..
Rachid Oussanaa

Ich meine, wie haben Sie Ihren SSH-Befehl ausgeführt?
Donnerstag,

@ Gnouc ./bin/myfunc.sh
Rachid Oussanaa

Antworten:


10

Ok, es gibt ein paar Probleme mit Ihrer Herangehensweise.

Sie exportieren eine Funktion, die zwischen Shells nicht portierbar ist. watchführt seine Befehle mit aus /bin/sh, was auf Ihrem System nicht der Fall ist bash. Unabhängig davon, um welche Shell es sich handelt, werden Funktionsexporte nicht berücksichtigt, sodass der Fehler angezeigt wird.

Zweitens können Sie Ihren Befehl in so etwas wie ändern watch bash -c 'func1', aber dies funktioniert möglicherweise auch nicht gut.
Der Grund hierfür ist, dass alle vom Skript gesetzten Variablen für die Funktion nicht verfügbar sind. Möglicherweise können Sie die Dateien exportieren, die Sie benötigen, aber das wird langsam chaotisch.

Die sicherste Lösung besteht darin, func1ein Skript selbst zu erstellen und dieses Skript aufzurufen.
 

Kurz gesagt, versuchen Sie:

watch bash -c func1

1
Es ist sehr CPU-intensiv, wenn die Funktion in.bash_profile
VarunAgw

@ VarunAgw, das ist ein guter Punkt. Es ist jedoch ein großartiger Befehl zum Überwachen von Dingen in einer Umgebung, in der die .bash_profileDatei relativ leer ist. Ich wollte jedoch einen Alias ​​ausführen, der sich in meiner .bash_aliasesDatei befand ( über meine.bashrc ), sodass ich das -iFlag schließlich auch zu bash hinzufügte . Ich dachte, das könnte jemandem helfen:watch bash -ic "func1; alias1; func2; …"
aaiezza

watch -x bash -c my-funcArbeiten Sie nur für mich auf Ubuntu Server 16.04 - während andere dies nicht tun.
Nam G VU

14

Die Standard-Shell für watchist /bin/sh. Shells erben keine exportierten Variablen oder Funktionen von anderen Shell-Typen.

Wenn Ihr System keine Verknüpfung /bin/shzu /bin/bash(oder Ihrer aktuellen Shell) herstellt, können Sie anweisen watch, Ihre Shell auszuführen, indem Sie -xoder --exec:

watch -x bash -c "my_func"

oder

watch --exec bash -c "my_func"

Dies unterscheidet sich von watch bash -c "test_watch"(mit Ausnahme von --exec), da /bin/shder untergeordnete Prozess (in diesem Fall bash) nicht erzeugt wird und vollständig beibehalten bashwird. Wie in anderen Antworten erwähnt, kann dies problematisch werden, wenn Funktionen exportiert werden, die stark an die aktuelle Umgebung gekoppelt sind (dh andere Variablen oder Funktionen erfordern).


Ein Beispiel:

test_watch() { echo 'Working!'; }
export -f test_watch
watch --exec bash -c "test_watch"

gibt das Vertraute

Every 2.0s: bash -c test_watch                                   Thu Mar 31 11:15:56 2016

Working!

Nur watch -x bash -c my-funcfunktioniert das ja für mich auf Ubuntu Server 16.04 - während andere das nicht tun. Danke vielmals!
Nam G VU

4

Warum watchaus Ihrem Skript heraus ausführen ? Warum haben Sie nicht dieses Shell-Skript:

$ cat func1 
#!/bin/bash

func1(){
  echo $1
}

func1 $1

... und dann lauf es so ...

$ watch func1 foo
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.