Le problème est que lorsque la montre est exécutée, elle s'exécute sh
et j'obtiens cette erreur:
sh: 1: func1: not found
voici le code:
#!/bin/bash
func1(){
echo $1
}
export -f func1
watch func1
Le problème est que lorsque la montre est exécutée, elle s'exécute sh
et j'obtiens cette erreur:
sh: 1: func1: not found
voici le code:
#!/bin/bash
func1(){
echo $1
}
export -f func1
watch func1
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è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 func1
un script par lui-même et d'appeler ce script.
En bref, essayez:
watch bash -c func1
.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 demander watch
d'exécuter votre shell en utilisant -x
ou --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/sh
pour générer le processus enfant (dans ce cas, bash
), en le maintenant bash
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:
test_watch() { echo 'Working!'; }
export -f test_watch
watch --exec bash -c "test_watch"
donne le familier
Every 2.0s: bash -c test_watch Thu Mar 31 11:15:56 2016
Working!
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:
$ cat func1
#!/bin/bash
func1(){
echo $1
}
func1 $1
... puis lancez-le comme ça ...
$ watch func1 foo