Das Problem ist, dass beim Ausführen von watch der folgende sh
Fehler auftritt:
sh: 1: func1: not found
Hier ist der Code:
#!/bin/bash
func1(){
echo $1
}
export -f func1
watch func1
Das Problem ist, dass beim Ausführen von watch der folgende sh
Fehler auftritt:
sh: 1: func1: not found
Hier ist der Code:
#!/bin/bash
func1(){
echo $1
}
export -f func1
watch func1
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 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, func1
ein Skript selbst zu erstellen und dieses Skript aufzurufen.
Kurz gesagt, versuchen Sie:
watch bash -c func1
.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 anweisen watch
, Ihre Shell auszuführen, indem Sie -x
oder --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/sh
der untergeordnete Prozess (in diesem Fall bash
) nicht erzeugt wird und vollständig beibehalten bash
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:
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!
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:
$ cat func1
#!/bin/bash
func1(){
echo $1
}
func1 $1
... und dann lauf es so ...
$ watch func1 foo