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.
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).
Antworten:
Ok, es gibt ein paar Probleme mit Ihrer Herangehensweise.
Sie exportieren eine Funktion, die zwischen Shells nicht portierbar ist.
watch
führt seine Befehle mit aus/bin/sh
, was auf Ihrem System nicht der Fall istbash
. 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,
func1
ein Skript selbst zu erstellen und dieses Skript aufzurufen.Kurz gesagt, versuchen Sie:
quelle
.bash_profile
.bash_profile
Datei relativ leer ist. Ich wollte jedoch einen Alias ausführen, der sich in meiner.bash_aliases
Datei befand ( über meine.bashrc
), sodass ich das-i
Flag schließlich auch zu bash hinzufügte . Ich dachte, das könnte jemandem helfen:watch bash -ic "func1; alias1; func2; …"
watch -x bash -c my-func
Arbeiten Sie nur für mich auf Ubuntu Server 16.04 - während andere dies nicht tun.Die Standard-Shell für
watch
ist/bin/sh
. Shells erben keine exportierten Variablen oder Funktionen von anderen Shell-Typen.Wenn Ihr System keine Verknüpfung
/bin/sh
zu/bin/bash
(oder Ihrer aktuellen Shell) herstellt, können Sie anweisenwatch
, Ihre Shell auszuführen, indem Sie-x
oder--exec
:oder
Dies unterscheidet sich von
watch bash -c "test_watch"
(mit Ausnahme von--exec
), da/bin/sh
der untergeordnete Prozess (in diesem Fallbash
) nicht erzeugt wird und vollständig beibehaltenbash
wird. 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:
gibt das Vertraute
quelle
watch -x bash -c my-func
funktioniert das ja für mich auf Ubuntu Server 16.04 - während andere das nicht tun. Danke vielmals!Warum
watch
aus Ihrem Skript heraus ausführen ? Warum haben Sie nicht dieses Shell-Skript:... und dann lauf es so ...
quelle