web-dev-qa-db-fra.com

Obtenir une variable de script dans le sous-shell lancé par find

Suite à cela question J'ai utilisé la commande suivante dans un script bash:

find ${svn_root} -maxdepth 2 -type d -exec bash -c 'if svnlook info "$1" &>/dev/null ;then echo"$1" >>${log_file} ;svnadmin verify "$1" 2>>{log_file} ;fi' _ {} \;

Les deux variables sont définies au début du script. La variable $ svn_root est développée de manière appropriée, mais pas la variable $ log_file.

Je vois que la variable n'est passée dans aucune des commandes -exec bash -c, je suppose que c'est parce que c'est un sous-shell? Je peux glisser log_file=/path/to/log ; devant la echo partie de la ligne, mais ce genre de code fixe cette partie de la commande, si je modifie la variable dans le script sans la modifier dans la commande find I Sera sortie dans deux fichiers journaux distincts!

Puis-je importer/exporter cette variable dans ce sous-shell (si c'est ce que c'est)?

2
Arronical

Il y a principalement deux manières:

  1. Transmettez-le comme deuxième argument au shell

    find ... -exec bash -c '...' _ {} "$log_file" \;
    

Et ensuite, vous utilisez "$2" au lieu de ${log_file} dans le script

  1. Passez le via l'environnement:

    log_file=$log_file find ... -exec bash -c '...' _ {} \;
    

BTW, ce n'est pas un sous-shell.

3
geirha

En utilisant

find ${svn_root} -maxdepth 2 -type d -exec bash -c 'if svnlook info "$0" &>/dev/null ;then echo"$0" >> "$1" ;svnadmin verify "$0" 2>> "$1" ;fi' {}  "$log_file" \;

Vous avez besoin de $0 et $1, car il ne s'agit ni d'une fonction ni d'un script.

2
A.B.

Vous devriez pouvoir voir de telles variables dans votre sous-shell si vous utilisiez des guillemets doubles avec bash -c "".

Une méthode plus simple consisterait à simplement export le log_file dans votre script principal, comme suit:

export log_file

Source: Comment “envoyer” la variable au sous-shell?

1
Sylvain Pineau