web-dev-qa-db-fra.com

La session SSH n'exporte pas de fonctions

J'ai un tas de fonctions stockées dans ~/.bash_functions, qui provient de ~/.bashrc au démarrage de Shell. Le fichier exporte toutes les fonctions comme ceci:

# Find functions in this script based on a grep search, and export them.
grep ^'[[:alnum:]]' ~/.bash_functions |
  grep '()' |
  cut -d'(' -f1 | 
  while read function
do
  export -f "$function"
done
unset function

Cela fonctionne parfaitement sur un shell local, mais pas via SSH. Aucune des fonctions n'est réellement exportée (vérifiée à l'aide de declare -F). Cependant, si je mets echo "$function" dans la boucle, il affiche tous les noms de fonctions, donc je sais que la seule partie de la boucle qui ne fonctionne pas est la ligne export.

Les fonctions sont exportées correctement si j'utilise export -f dans la session SSH, ou si j'ajoute un export -f ligne pour chaque fonction individuelle du fichier.

J'utilise 14.04 avec Bash 4.3.11, et le client SSH est Termux sur Android.

Modifier: même si j'ajoute declare -F en bas de ~/.bash_functions, les fonctions s'affichent comme non exportées.

Edit: Je viens de réaliser que dans une session locale, certaines de mes fonctions ne sont pas exportées, apparemment au hasard, mais je ne trouve aucune preuve d'erreur. Je fais plus de recherches ...

3
wjandrea

Étant donné que la boucle while est dans un pipeline, elle est exécutée dans un sous-shell. Si vous vous déconnectez et vous connectez, vous verrez qu'une session locale sera également affectée (pas seulement SSH). Cela peut être résolu en déplaçant la liste dans une variable et en basculant vers une boucle for:

# Find functions in this script based on a grep search, and export them.
functions="$( grep ^'[[:alnum:]]' ~/.bash_functions |
  grep '()' |
  cut -d'(' -f1 
)"

for function in $functions; do
  export -f "$function"
done
unset -v function functions # Also I added the -v flag to make this only unset variables.
0
wjandrea