A sessão SSH não exporta funções

3

Eu tenho um monte de funções armazenadas em ~/.bash_functions , que é originado por ~/.bashrc na inicialização do shell. O arquivo exporta todas as funções da seguinte forma:

# 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

Isso funciona perfeitamente em um shell local, mas não via SSH. Nenhuma das funções é realmente exportada (verificada usando declare -F ). No entanto, se eu colocar echo "$function" no loop, ele imprime todos os nomes de função, portanto, sei que a única parte do loop que não está funcionando é a export line.

As funções são exportadas corretamente se eu usar export -f na sessão SSH ou se eu adicionar uma linha export -f para cada função individual no arquivo.

Estou usando o 14.04 com o Bash 4.3.11, e o cliente SSH é o Termux no Android.

Editar: mesmo se eu adicionar declare -F na parte inferior de ~/.bash_functions , as funções serão mostradas como não exportadas.

Edit: Acabei de perceber que em uma sessão local, algumas das minhas funções não são exportadas, aparentemente aleatoriamente, mas não consigo encontrar nenhuma evidência de erro. Eu estou fazendo mais pesquisas ...

    
por wjandrea 27.07.2016 / 20:37

1 resposta

0

Como o loop while está em um pipeline, ele está sendo executado em um subshell. Se você efetuar logout e login, você verá que uma sessão local também será afetada (não apenas SSH). Isso pode ser corrigido movendo a lista para uma variável e mudando para um for loop:

# 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.
    
por wjandrea 28.07.2016 / 16:36