Bash
命令替換將引號內的空格解釋為參數分隔符
我想要一個
alias
另外附加到的~/.bashrc
,例如function tailias { $(echo "alias $1='${*:2}'" | tee -a ~/.bashrc) }
我正在使用
tee
將命令拆分為,~/.bashrc
同時保持標準輸出完整地由$()
.這適用於別名單字命令,例如
[/home/acheong87] tailias f g [/home/acheong87] alias alias f='g'
我看到它附加到我的
~/.bashrc
. 但是對於帶空格的命令,我得到[/home/acheong87] tailias ll 'ls -al' -bash: alias: -al: not found
它看起來是正確的
~/.bashrc
——alias ll='ls -al'
——但在別名列表中我得到了這個瘋狂的東西:
[/home/acheong87] alias alias ll=''\''ls'
我試過把引號放在不同的地方,但無濟於事。我已經將函式簡化為
echo
,並且就像在 中一樣~/.bashrc
,它看起來是正確的——所以我無法弄清楚是什麼隱藏的步驟轉移了我的注意力。
你可以
eval
實現你想要的:function tailias { eval $(echo "alias $1='${*:2}'" | tee -a ~/.bashrc) }
在這個問題中更好地解釋了這一點(給出了替代解決方案)
https://stackoverflow.com/questions/11079342/execute-command-containing-quotes-from-shell-variable
或直接在 bash 常見問題解答中:
而不是使用
eval
andtee
執行命令兩次來添加臨時alias
和永久alias
in~/.bashrc
,您可以~/.bashrc
在附加文件後簡單地重新載入文件,這將更新別名列表。function tailias { echo "alias $1='${*:2}'" >> ~/.bashrc && source ~/.bashrc }