2012-10-02 1 views
2

J'ai le script bash suivant (il s'agit d'une version simplifiée d'un script plus complexe).Sous-shell dans une fonction ne peut pas trouver les commandes bash de base lorsqu'il est appelé à partir d'une autre fonction

#!/usr/bin/env bash 
set -x 

function execute() { 
    `$1` # same as $($1), gives "command not found" as do all the following: 
    # $1 # or ${1} 
    # eval "$1" 
    # eval $1 

    # This gives "No such file or directory" even though it *is* there... 
    #"$1" 
} 

function runCommand() { 
    PATH="${1}" 
    execute "chmod 777 ${PATH}" 
} 

execute "chmod 777 ${1}" 
runCommand "$1" 

#EOF 

Quand je le lance-je obtenir la sortie suivante:

+ execute 'chmod 777 build.test-case.sh' 
++ chmod 777 build.test-case.sh 
+ runCommand build.test-case.sh 
+ PATH=build.test-case.sh 
+ execute 'chmod 777 build.test-case.sh' 
++ chmod 777 build.test-case.sh 
./build.test-case.sh: line 5: chmod: command not found 

Ainsi chmod fonctionne lorsque la fonction execute est appelé directement, mais ne parvient quand il est appelé d'une autre fonction, même si la sortie de débogage semble être exactement les mêmes ...

Quelqu'un peut-il expliquer ce comportement?

Répondre

3

Le problème est que vous écrasez la variable PATH, qui contient les chemins vers les répertoires où les binaires sont, comme le chmod un, c'est pourquoi il ne peut pas le trouver.

Si vous utilisez une autre variable, au lieu du PATH un, pour votre fonction runCommand(), il devrait fonctionner, comme ceci:

function runCommand() { 
    VAR="${1}" 
    execute "chmod 777 ${VAR}" 
} 
+0

Eh bien, ce oeuf sur mon visage, puis. Cela m'apprendra à ne pas adhérer à mes propres normes de ne jamais utiliser toutes les vars caps. :-) – Potherca

Questions connexes