1つのコマンドで変数を設定してエクスポートするのではなく、最初に変数を設定してからエクスポートするのはなぜですか?

1つのコマンドで変数を設定してエクスポートするのではなく、最初に変数を設定してからエクスポートするのはなぜですか?

実行すると、シェルがgpg-agent直接処理できるデータを出力します。たとえば、次のようになります。

SSH_AUTH_SOCK=/tmp/ssh-apeOFqMF3292/agent.3292; export SSH_AUTH_SOCK;
SSH_AGENT_PID=3293; export SSH_AGENT_PID;
echo Agent pid 3293;

なぜこのようなことをするのかgpg-agent?私はより多くのプログラムがこれを行うのを見ました。以前のシェルはこれをサポートしていませんかexport var=val?組み込みの交換シェルをサポートしていないシェルは何ですか?

私はKubuntuでbashを使用しています。

答え1

従来のBourneシェルはそれらを組み合わせることをサポートしていません(System Vではこれを省略できますが、;4.2BSD / SunOSシェルではそうではありません)。これはKornシェル(exportBourneシェルとのcshクロスオーバーsetenv)によって追加され、その後他のシェルとPOSIX.2に採用されました。多くの商用UnixはまだBourneシェルのSystem Vバリアントを提供しているので、/bin/sh互換性を維持することは移植性にとって良い考えです。

答え2

定数文字列では機能しませんが、それを2つの別々のコマンドで実行する習慣がある理由の1つは、export FOO=$(mycmd)終了状態を隠すことですmycmdmycmd失敗しても成功を報告します。バラより 変数割り当ての戻り状態はどのように決定されますか? そしてシェルチェックウィキ

関連情報