Zsh

如何使用環境變數在 zsh 中儲存標誌?

  • March 9, 2022

我正在使用kubectl和 zsh,我想將命名空間標誌儲存在環境變數中。

而不是寫:

kubectl get pods -n mynamespace

我想做類似的事情:

n='-n mynamespace'
kubectl get pods $n

但這樣做,我得到:

No resources found in  mynamespace namespace.

in注意單詞和之間的兩個空格mynamespace

如果我執行kubectl get pods -n mynamespace,我會獲得正確的輸出:

NAME    READY   STATUS    RESTARTS   AGE
nginx   1/1     Running   0          16m

這裡會發生什麼?為什麼輸出中的單詞in和之間有兩個空格mynamespace?以及如何將命名空間標誌儲存在環境變數中?

zsh 不對變數執行分詞,而是將其值作為單個參數傳遞。我這裡沒有 kubectl,但你可以用任何東西重現該行為,例如 mkdir:

var='-p a/b/c/d'
comp% mkdir $var
mkdir: invalid option -- ' '
Try 'mkdir --help' for more information.

您可以使用以下方法呼叫相同的錯誤:

comp% mkdir '-p a/b/'
mkdir: invalid option -- ' '
Try 'mkdir --help' for more information.

您可以使用以下命令查看 zsh 真正在做什麼strace -f mkdir $var

execve("/usr/bin/mkdir", ["mkdir", "-p a/b/c/d"], 0x7ffce5e6afb0 /* 61 vars */) = 0

正如this answer on SO中所建議的, 您需要啟用分詞,例如:

comp% mkdir -p ${=var}

在您的情況下,它將是:

kubectl get pods ${=n}

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