Environment-Variables

如何創建作為命令輸出的環境變數

  • January 7, 2019

如何創建作為特定命令結果的環境變數?具體來說,我想要一個環境變數( $ BWD) that is the basename of $ 殘疾人士

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

通常,序列foo="$(bar)"將執行命令bar並將輸出分配給變數。

例如

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

這將創建一個 shell 變數。如果你想把它變成一個環境變數(可以被子shell看到)你可以export

例如

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

但是,在這種情況下不需要執行命令,而是使用 shell 變數擴展

BWD=${PWD##*/}

在類似 Bourne 的 shell 中,您可以使用內置實用程序通過使用屬性標記shell變數來創建環境變數(因此它被導出到 shell 將執行的命令的環境中) :export``export

export BWD

要將值分配給 shell 變數,語法是:

BWD=value

您可以使用命令替換將該值作為命令的輸出。在 Bourne shell 中,這是使用the-command語法,但在現代的 Bourne-like shell 中,首選的方式是使用$(the-command)

BWD=$(the-command)

通常,您需要在命令替換周圍加上引號以防止split+glob。但是,split+glob 不會出現在對標量變數的賦值中,因此在這裡它們不是必需的。

獲取文件路徑的基本名稱的命令是basename命令。

basename "$PWD"

(引號是必要的,因為 split+glob 確實出現在命令的參數中)。

這將返回儲存在 中的文件的基本名稱$PWD,除非該值以 開頭-,在這種情況下,YMMV 盡可能多basename的實現將其視為一個選項。所以一般來說,在將可變數據傳遞給命令時,我們使用 a--來告訴命令,即使它以-(這裡,$PWD應該總是以/除了非常病態的情況下,所以它不是嚴格的需要)。

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

在現代 shell 中,您可以將兩者結合:

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

(在某些實現中需要引號,因為我們回到命令的參數中,儘管其他一些實現export在某些條件下確實將類似賦值的參數解析為特殊情況)。

這種方法的一個問題是,如果$PWD以換行符結尾的值(在實踐中不太可能)作為命令替換會去除所有尾隨換行符。所以在:

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

$BWD將包含foo而不是$'foo\n\n'.

相反,您可能希望使用 shell 內置運算符來獲取該基本名稱。在zsh中,這可以用$PWD:t( tfor tail) 來完成;在所有類似 POSIX 的 shell(包括 zsh)中,可以這樣做${PWD##*/}/$PWD.

$PWD但是如果是,它會給出不同的結果/。在這種情況下,basename返回/but${PWD##*/}$PWD:t擴展為空字元串。對於像/foo/bar/($PWD通常不以/除了/它自己之外的目錄結尾),basename$PWD:t給出bar, 同時${PWD##*/}再次給出空字元串。

對於動態擴展為 的基本名稱的變數$PWD,您可以使用ksh93及其規則函式:

ksh93也有一個內置版本basename提供你已經/opt/ast/bin提前$PATH. 所以在 ksh93 中:

$ 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; }它更有效,因為它不會創建子 shell 環境來執行命令。

引用自:https://unix.stackexchange.com/questions/493081