特定のコマンドの結果として環境変数を作成するには?特に、$ 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のようなシェルでは、次のものを作成できます。環境変数は次のように表示されます。シェルexport
export
組み込みユーティリティを使用して、属性とともに変数をエクスポートします(シェルが実行するコマンド環境にエクスポートできるように)。
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")"
$BWD
foo
代わりに含まれます$'foo\n\n'
。
代わりに、デフォルト名を取得するためにシェル組み込み演算子を使用できます。すべてのPOSIX様シェル(zshを含む)では、これはすべてのPOSIX様シェル(zshを含む)で(尾の場合)をzsh
使用して実行できます。$PWD:t
t
${PWD##*/}
/
$PWD
$PWD
しかし、もしそうなら、他の結果が出るでしょう/
。この場合、しかしbasename
返されるか、空の文字列に展開されます。このようなディレクトリ(通常は自分を除いてwhileで終わらない)の場合、whileは再び空の文字列を提供します。/
${PWD##*/}
$PWD:t
/foo/bar/
$PWD
/
/
basename
$PWD:t
bar
${PWD##*/}
デフォルト名に動的に拡張される変数の場合は、次のようになります$PWD
。ksh93
規律機能:
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)"
返すことができます。したがって、お客様のユースケースは次のとおりです。command
foo
$ BWD="$(basename "$PWD")"