Pipe

採購腳本來更改密碼,忽略命令末尾的管道?

  • September 30, 2021

我寫了一個小腳本,可以讓我切換到路徑上的腳本目錄,這有助於我快速找到我想要編輯的其他腳本,與原始腳本位於同一文件夾中。

我傾向於通過回顧歷史來做到這一點,並為該命令加上前綴,無論它是什麼,就像這樣

$ . cdbin my_super_script

這在大多數情況下都有效 - 但是 - 當我執行的最後一個命令在某處通過管道傳輸時,它不起作用,

例如

# if my last command was the following
$ my_super_script | grep -v bad | grep good

# then when I try and run my cdbin script using history, it looks like this
$ . cdbin my_super_script | grep -v bad | grep good

然後它什麼也沒做 - 沒有錯誤,它只是讓我留在我的目前目錄中。

這是我的簡單cdbin腳本:

cdbin

PROG=$(which "$1")
DIR=$(dirname "$PROG")
cd "$DIR" 

編輯:請注意,我知道我可以在大多數情況下簡單地輸入類似以下內容來避免這種情況,例如,$ . cdbin !:0但發現輸入有點尷尬:D

當您使用管道執行此命令時,您的. cdbin命令在子shell 中執行:因此它會更改子shell 中的目錄,並且當子shell 關閉時效果會失去。

為避免這種情況,由於您只對之前執行的命令感興趣,請使用歷史記錄:

. cdbin !!:0

這將提取上一個命令的第一個單詞,因此在您的場景中,您最終會得到

. cdbin my_super_script

您可以改用fc提取前面的命令:

. cdbin $(fc -l -1 | awk '{print $2}')

可以將其轉換為別名以使其更易於使用,或者使其成為cdbin自身的一部分,例如,如果在沒有任何參數的情況下呼叫它:

CMD=${1:-$(fc -l -1 | awk '{print $2}')}
PROG=$(which "$CMD")
DIR=$(dirname "$PROG")

cd "$DIR" 

unset CMD PROG DIR

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