Shell

如何動態更改別名中的路徑?

  • December 10, 2019

我的.cshrc文件中有一堆使用路徑的別名:

/projects/project_name/my_name/$CLIENT

我編寫了一個簡短的腳本,旨在從我的工作目錄路徑中獲取一個文件夾名稱,並將其儲存到一個環境變數中,以便在各種別名中使用。

set client_name = `echo $PWD | awk -F / '{ print $5; }' | xargs`

setenv CLIENT $client_name  

source ~/.cshrc   

目前的問題是環境變數在執行時不會從其先前的值更新。不幸的是,C shell 不支持在 Bash 中使用函式(一種潛在的替代方法)。

如何從命令行獲取要更新的變數?有沒有更好的方法來實現這一點?

謝謝

您的腳本可能會在其中放置一個空白字元串,$5因為您的工作目錄路徑 ( ) 中沒有五個變數pwd,但是如果沒有看到輸入字元串就很難說。如果您需要有關此問題的更多幫助,您將需要使用更多資訊更新您的問題,並向我們展示發送到的輸入的awk樣子。

我不知道是否有辦法使別名動態化,但您可以簡單地將每個別名轉換為 bash 函式。Bash 函式採用 的形式funct_name () {commands},它們甚至採用儲存在變數$1, $2, $3, … 等中的參數。因此,您可以創建一個 bash 函式,將動態數據作為參數讀取。例如:

test () {
 echo $1
}

將表現如下:

$ test abc
abc
$ test foobar
foobar

使用這種方法,您可以使用 alias 命令並將其放置echo在我的範例中,使用$1而不是$CLIENT. 但是,您甚至不必將每個別名重新創建為 bash 函式並以這種方式使用參數。

從您給我的範例命令來看,您似乎正在從工作目錄路徑中獲取文件夾名稱並將其儲存到環境變數中以在各種別名中使用它。您可以簡單地創建一個 bash 函式來為您完成此任務。作為一個例子,這裡有一個 bash 函式,它將獲取您的工作目錄的路徑,找到第一個文件夾名稱(您似乎想要第四個,所以更改它),並將其保存到$TEST環境變數中。

test () {
 var=$(pwd | awk -F / '{ print $2; }')
 export TEST=$var
}

如果您希望此功能始終可供您使用,請將上述內容添加到您的.bashrc文件中。每當您啟動一個新的終端視窗時,該test命令都將供您使用。如果您想將它添加到您目前的工作終端(而不必打開一個新終端),請執行source ~/.bashrc. 然後,您可以在終端中執行該函式,就像它是一個命令一樣。您將剛剛執行test並且環境變數將更新並且您的別名命令應該可以工作。這是它的一個例子:

$ pwd
/home/user
$ echo $TEST

$ test
$ echo $TEST
home

**請注意:**此命令取決於您在哪個目錄中工作。如果您將文件夾更改為根目錄,我的範例將在其中放置一個空字元串,$TEST因為第一個斜杠之後沒有字元串。這可能是awk在您的情況下列印空字元串的原因,但同樣,如果沒有看到輸入數據,我不能肯定地說。

考慮添加一個別名,每次更改目錄時cd都會更新變數。$CLIENT

alias cd 'cd \!*; set client_name = `echo $PWD | awk -F / '\''{ print $5; }'\'' | xargs`; setenv CLIENT $client_name'

這當然有缺點。例如,它不適用於pushdor popd,儘管您可能可以使用類似的別名來解決這個問題。可能還有其他我沒有充分考慮的極端情況。

還要考慮您保留在 cshrc 文件中的別名是否真的需要是別名。除非它們以某種方式修改 shell 環境(通過設置變數或更改目錄),否則它們可能是獨立的 shell 腳本。在這種情況下,您實際上可以使用支持函式的 shell 來編寫它們。

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