環境変数を保存するには、 find -exec を使用します。

環境変数を保存するには、 find -exec を使用します。

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 -cfind-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"

現在のシェルではモードが設定されていませんxprintf最後に空白行が出力されます)。

おすすめ記事