Bash

命令替換將引號內的空格解釋為參數分隔符

  • January 13, 2014

我想要一個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 常見問題解答中:

http://mywiki.wooledge.org/BashFAQ/050

而不是使用evalandtee執行命令兩次來添加臨時alias和永久aliasin ~/.bashrc,您可以~/.bashrc在附加文件後簡單地重新載入文件,這將更新別名列表。

function tailias
{
   echo "alias $1='${*:2}'" >> ~/.bashrc && source ~/.bashrc
}

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