find -execを使用して環境変数を保存できますか? FreeBSD バージョンの find を使用するオプションは表示されません。必要に応じてforループに切り替えることができますが、execの単純さとスピードを好みます。
私が見るのが良くないと思われるもう1つのオプションは、環境をダンプしてから、実行中のコマンドから読み直すことです。
編集する:
find . -type f -name '*/*.patch/go' -exec go install {} \;
この例では、httpプロキシを使用したいと思います。上記のグローバルhttpプロキシを設定するようにgitに指示するコードはすでにあります。
したがって、次の例では、sh?をプレフィックスとして使用する必要があります。なぜ?
ベストアンサー1
子プロセスは常に環境を継承します。これは、実行しているユーティリティがfind ... -exec
その環境にアクセスできることを意味します。
これをテストしてみてください。
$ unset -v myvar1 myvar2
$ export myvar1='hello world'
$ myvar2='not exported'
$ find . -exec sh -c 'for pathname do printf "found %s, myvar1=%s, myvar2=%s\n" "$pathname" "$myvar1" "$myvar2"; done' sh {} +
found ., myvar1=hello world, myvar2=
found ./.bash_profile, myvar1=hello world, myvar2=
found ./.bashrc, myvar1=hello world, myvar2=
found ./.yashrc, myvar1=hello world, myvar2=
found ./.zshrc, myvar1=hello world, myvar2=
ここでは両方のシェル変数を消去してからmyvar1
設定myvar2
してエクスポートしmyvar1
ますが、何もありませんmyvar2
。これはmyvar1
、すべての子プロセスから継承でき、myvar2
継承されないことを意味します。
出力に示すように、エクスポートされたfind
コンテンツは、一括して見つかったパス名を呼び出す単一引用符myvar1
スクリプトで使用できます。sh -c
find
-exec
コマンドの前に割り当てを使用して、find
現在のシェルで環境変数の値を設定せずに環境変数の値を設定することもできます。これはfind
、仕組みだけでなく標準的な構文です。
$ unset -v myvar1 myvar2
$ myvar2='now in environment' find . -exec sh -c 'for pathname do printf "found %s, myvar1=%s, myvar2=%s\n" "$pathname" "$myvar1" "$myvar2"; done' sh {} +
found ., myvar1=, myvar2=now in environment
found ./.bash_profile, myvar1=, myvar2=now in environment
found ./.bashrc, myvar1=, myvar2=now in environment
found ./.yashrc, myvar1=, myvar2=now in environment
found ./.zshrc, myvar1=, myvar2=now in environment
この構文を使用しない別の例は次のとおりですfind
。
$ unset -v x
$ x='hello there' sh -c 'printf "%s\n" "$x"'
hello there
$ printf "%s\n" "$x"
現在のシェルではモードが設定されていませんx
(printf
最後に空白行が出力されます)。