如何創建作為命令輸出的環境變數
如何創建作為特定命令結果的環境變數?具體來說,我想要一個環境變數( $ 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
(t
for 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 環境來執行命令。