Ok, il y a donc quelques problèmes avec votre approche.
Vous exportez une fonction qui n'est pas portable entre les shells. watchexécute ses commandes avec /bin/sh, ce qui n'est pas le cas sur votre système bash. Et quel que soit le shell, il ne respecte pas les exportations de fonctions, vous obtenez donc l'erreur.
Deuxièmement, vous pouvez changer votre commande en quelque chose comme watch bash -c 'func1', mais cela peut ne pas bien fonctionner non plus.
La raison ici est que toutes les variables définies par le script ne seront pas disponibles pour la fonction. Vous pourriez être en mesure d'exporter ceux dont il a besoin, mais cela commence à devenir désordonné.
La solution la plus sûre est de mettre func1un script par lui-même et d'appeler ce script.
Il est très consommateur de CPU dans le cas où la fonction est définie dans.bash_profile
VarunAgw
@VarunAgw, c'est un bon point. Cependant, c'est une excellente commande pour surveiller les choses dans un environnement où le .bash_profilefichier est relativement vide. Cependant, je voulais exécuter un alias qui se trouvait dans mon .bash_aliasesfichier ( provenant de mon.bashrc ), j'ai donc fini par ajouter également l' -iindicateur à bash. J'ai pensé que cela pourrait aider quelqu'un:watch bash -ic "func1; alias1; func2; …"
aaiezza
Ne watch -x bash -c my-funcfonctionne que pour moi sur Ubuntu Server 16.04 - tandis que d'autres ne le font pas.
Nam G VU
14
Le shell par défaut pour watchest /bin/sh. Les shells n'hériteront pas des variables ou fonctions exportées d'autres types de shell.
Si votre système ne crée pas de lien symbolique /bin/shvers /bin/bash(ou votre shell actuel), vous pouvez demander watchd'exécuter votre shell en utilisant -xou --exec:
watch -x bash -c "my_func"
ou
watch --exec bash -c "my_func"
Ceci est différent de watch bash -c "test_watch"(à l'exclusion de --exec) car il n'utilise pas /bin/shpour générer le processus enfant (dans ce cas, bash), en le maintenant bashcomplètement. Comme indiqué dans d'autres réponses, cela peut devenir compliqué si vous exportez des fonctions fortement couplées à l'environnement actuel (c'est-à-dire nécessitant d'autres variables ou fonctions).
Réponses:
Ok, il y a donc quelques problèmes avec votre approche.
Vous exportez une fonction qui n'est pas portable entre les shells.
watch
exécute ses commandes avec/bin/sh
, ce qui n'est pas le cas sur votre systèmebash
. Et quel que soit le shell, il ne respecte pas les exportations de fonctions, vous obtenez donc l'erreur.Deuxièmement, vous pouvez changer votre commande en quelque chose comme
watch bash -c 'func1'
, mais cela peut ne pas bien fonctionner non plus.La raison ici est que toutes les variables définies par le script ne seront pas disponibles pour la fonction. Vous pourriez être en mesure d'exporter ceux dont il a besoin, mais cela commence à devenir désordonné.
La solution la plus sûre est de mettre
func1
un script par lui-même et d'appeler ce script.En bref, essayez:
la source
.bash_profile
.bash_profile
fichier est relativement vide. Cependant, je voulais exécuter un alias qui se trouvait dans mon.bash_aliases
fichier ( provenant de mon.bashrc
), j'ai donc fini par ajouter également l'-i
indicateur à bash. J'ai pensé que cela pourrait aider quelqu'un:watch bash -ic "func1; alias1; func2; …"
watch -x bash -c my-func
fonctionne que pour moi sur Ubuntu Server 16.04 - tandis que d'autres ne le font pas.Le shell par défaut pour
watch
est/bin/sh
. Les shells n'hériteront pas des variables ou fonctions exportées d'autres types de shell.Si votre système ne crée pas de lien symbolique
/bin/sh
vers/bin/bash
(ou votre shell actuel), vous pouvez demanderwatch
d'exécuter votre shell en utilisant-x
ou--exec
:ou
Ceci est différent de
watch bash -c "test_watch"
(à l'exclusion de--exec
) car il n'utilise pas/bin/sh
pour générer le processus enfant (dans ce cas,bash
), en le maintenantbash
complètement. Comme indiqué dans d'autres réponses, cela peut devenir compliqué si vous exportez des fonctions fortement couplées à l'environnement actuel (c'est-à-dire nécessitant d'autres variables ou fonctions).Un exemple:
donne le familier
la source
watch -x bash -c my-func
oui, cela fonctionne pour moi sur Ubuntu Server 16.04 - tandis que d'autres ne le font pas. Merci beaucoup!Pourquoi exécuter
watch
depuis l'intérieur de votre script? Pourquoi ne pas avoir ce script shell:... puis lancez-le comme ça ...
la source