コマンド出力で環境変数を作成する方法

コマンド出力で環境変数を作成する方法

特定のコマンドの結果として環境変数を作成するには?特に、$ PWDのデフォルト名である環境変数($ BWD)が必要です。

$ cd /home/devel/Autils/lib
$ echo $PWD
/home/devel/Autils/lib
$ # something here to assign BWD
$ echo $BWD
lib

答え1

通常、シーケンスはfoo="$(bar)"コマンドを実行し、bar出力を変数に割り当てます。

例えば

% echo $PWD
/home/sweh
% BWD="$(basename "$PWD")"
% echo $BWD
sweh

これによりシェル変数が生成されます。作りたいなら環境変数(サブシェルで見ることができます)を使用できますexport

例えば

export BWD="$(basename "$PWD")"

ただし、この場合は必要ありません。走るコマンドですが、シェル変数拡張を使用します

BWD=${PWD##*/}

答え2

Bourneのようなシェルでは、次のものを作成できます。環境変数は次のように表示されます。シェルexportexport組み込みユーティリティを使用して、属性とともに変数をエクスポートします(シェルが実行するコマンド環境にエクスポートできるように)。

export BWD

シェル変数に値を割り当てる構文は次のとおりです。

BWD=value

この値をコマンドの出力として使用できます。コマンドの置き換え。 Bourneシェルでは`the-command`構文を使用しますが、現代のBourneのようなシェルでは好ましい方法は以下を使用することです$(the-command)

BWD=$(the-command)

通常、コマンドの置換を防ぐには引用符が必要です。分割+グローバル。ただし、スカラー変数の割り当てには Split+glob は表示されないため、ここでは必要ありません。

ファイルパスのデフォルト名を取得するコマンドはcommandですbasename

basename "$PWD"

(split + globがコマンド引数に表示されるため、引用符が必要です。)

多くの実装はこれをオプションとして扱うので、$PWD値がYMMVで始まらない限り、保存されたファイルのデフォルト名を返します。したがって、通常、変数データをコマンドに渡すときに、aを使用して、次のものが次から始まってもオプションとして処理されないことをコマンドに知らせます(ここでは非常に病理的な場合を除いて常に開始する必要があります)。したがって、厳密には要求されません)。-basename---$PWD/

BWD=$(basename -- "$PWD")
export BWD

最新のシェルでは、次の2つを組み合わせることができます。

export BWD="$(basename -- "$PWD")"

(一部の実装ではコマンドの引数に戻るため、一部の実装では引用符が必要ですが、他の実装では割り当てに似た引数をexport特殊なケースとして解析します。)

このアプローチの1つの問題は、'sの値が$PWD改行文字で終わる場合(実際にはそうではない可能性が低い)、コマンドの置き換え巻きみんな末尾の改行文字。だから:

mkdir $'foo\n\n'
cd $'foo\n\n'
export BWD="$(basename -- "$PWD")"

$BWDfoo代わりに含まれます$'foo\n\n'

代わりに、デフォルト名を取得するためにシェル組み込み演算子を使用できます。すべてのPOSIX様シェル(zshを含む)では、これはすべてのPOSIX様シェル(zshを含む)で(尾の場合)をzsh使用して実行できます。$PWD:tt${PWD##*/}/$PWD

$PWDしかし、もしそうなら、他の結果が出るでしょう/。この場合、しかしbasename返されるか、空の文字列に展開されます。このようなディレクトリ(通常は自分を除いてwhileで終わらない)の場合、whileは再び空の文字列を提供します。/${PWD##*/}$PWD:t/foo/bar/$PWD//basename$PWD:tbar${PWD##*/}

デフォルト名に動的に拡張される変数の場合は、次のようになります$PWDksh93規律機能:

ksh93あらかじめbasename持っている限り内蔵バージョンもあります。したがって、ksh93には次のものが含まれます。/opt/ast/bin$PATH

$ PATH=/opt/ast/bin:$PATH
$ type basename
basename is a shell builtin version of /opt/ast/bin/basename
$ BWD.get() { .sh.value=${ basename -- "$PWD"; }; }
$ cd /var/log
$ echo "$BWD"
log
$ cd /usr/local
$ echo "$BWD"
local
$ export BWD
$ printenv BWD
local

上記ではksh93固有のフォーマットを使用しました。コマンドの置き換え${ the-command; }コマンドを実行するためのサブシェル環境を作成しないため、より効率的です。

bashシェルについては、以下を参照してください。変数宣言時のコマンド置換実行の防止いくつかの方法では。

答え3

この設定を使用して、aの出力を変数としてfoo="$(command)"返すことができます。したがって、お客様のユースケースは次のとおりです。commandfoo

$ BWD="$(basename "$PWD")"

関連情報