2017-09-25 3 views
1

J'ai ces fonctions dans mon .bashrc:Bash: comment utiliser une fonction (qui est une chaîne param) dans une autre fonction

# This function just untar a file: 
untar() 
{ 
    tar xvf $1 
} 

# This function execute a command with nohup (you can leave the terminal) and nice for a low priority on the cpu: 
nn() 
{ 
    nohup nice -n 15 "[email protected]" & 
} 

Avant de tester la fonction nn, je crée un goudron:

echo test > test.txt 
tar cvf test.txt.tar test.txt 

maintenant ce que je veux faire est:

nn untar test.txt.tar 

Mais seulement cela fonctionne:

nn tar xvf test.txt.tar 

Ici l'erreur dans nohup.out:

nice: ‘untar’: No such file or directory 

Répondre

2

fonctions ne sont pas des citoyens de première classe. Le shell sait ce qu'ils sont, mais les autres commandes comme find, xargs et nice ne le font pas. Pour appeler une fonction d'un autre programme, vous devez (a) l'exporter vers des sous-shells, et (b) appeler explicitement un sous-shell.

export -f untar 
nn bash -c 'untar test.txt.tar' 

Vous pouvez automatiser cela si vous voulez le rendre plus facile pour l'appelant:

nn() { 
    if [[ $(type -t "$1") == function ]]; then 
     export -f "$1" 
     set -- bash -c '"[email protected]"' bash "[email protected]" 
    fi 

    nohup nice -n 15 "[email protected]" & 
} 

Cette ligne mérite une explication:

set -- bash -c '"[email protected]"' bash "[email protected]" 
  1. set -- change les arguments de la fonction en cours ; il remplace "[email protected]" par un nouvel ensemble de valeurs.
  2. bash -c '"[email protected]"' est l'invocation explicite du sous-shell.
  3. bash "[email protected]" sont les arguments du sous-shell. bash est $0 (non utilisé). Les arguments existants externes "[email protected]" sont passés à la nouvelle instance bash sous la forme $1, $2, etc. Voici comment nous obtenons que le sous-shell exécute l'appel de fonction.

Voyons ce qui se passe si vous appelez nn untar test.txt.tar. Le contrôle type -t voit que untar est une fonction. La fonction est exportée. Puis, set change les arguments nn de untar test.txt.tar à bash -c '"[email protected]"' bash untar test.txt.tar.