web-dev-qa-db-ja.com

findによって起動されたサブシェルにスクリプト変数を取得します

これに続いて question 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' _ {} \;

両方の変数は、スクリプトの先頭で定義されます。変数$ svn_rootは適切に展開されますが、$ log_file変数は展開されません。

変数が-exec bash -cコマンドのいずれにも渡されないことがわかります。これはサブシェルだからだと思いますか?行のecho部分の前でlog_file=/path/to/log ;をスリップできますが、findコマンド内で変数を変更せずにスクリプト内の変数を変更すると、コマンドのその部分のハードコードの種類2つの個別のログファイルに出力します。

その変数をそのサブシェルにインポート/エクスポートできますか(もしそうであれば)?

2
Arronical

主に2つの方法があります。

  1. シェルの2番目の引数として渡します

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

そして、"$2" の代わりに ${log_file}スクリプト内

  1. 環境経由で渡します:

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

ところで、それはサブシェルではありません。

3
geirha

を使用して

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" \;

これは関数でもスクリプトでもないため、$0および$1が必要です。

2
A.B.

_bash -c ""_で二重引用符を使用した場合、サブシェルでそのような変数を表示できるはずです。

より簡単な方法は、次のように、メインスクリプトの_log_file_変数をexportだけにすることです。

_export log_file
_

ソース: サブシェルに変数を「送信」する方法

1
Sylvain Pineau