
我有 3 個別名。它們被命名為 echo1、echo2、echo3
我如何將這三個命令作為更大命令的一部分來執行?
$ alias echo1='echo 1'
$ alias echo2='echo 2'
$ alias echo3='echo 3'
$ echo1
1
$ echo2
2
$ echo3
3
$ echo{1..3}
bash: echo1: command not found
$ bash -ic echo{1..3}
echo2: echo1: command not found
$ bash -ic 'echo{1..3}'
bash: echo1: command not found
解決方案:基於Kusalananda的回答:
printf '%s\n' {1..3} | xargs -I {} bash -ic "echo{}"
答案1
由於事物評估的順序,echo$i
將被評估為字串echo1
(for i=1
)後別名擴充。
為了能夠使用該字串作為別名,您需要重新評估結果字串:
for i in 1 2 3; do
eval "echo$i"
done
如果echo1
,echo2
並且echo3
曾經是外殼函數,那麼就eval
不需要了(在 Bash 4.4 中測試)。
您的嘗試bash -c
將不起作用,因為別名是當前 shell 會話的本機別名。
你最初的事情
echo{1..3}
會導致
echo1 echo2 echo3
即使echo1
擴展為echo 1
,結果也是字串的輸出
1 echo2 echo3
就個人而言,取決於您想要別名的目的實際上這樣做,我會實作一個功能:
dothing () {
printf '%s\n' "$@"
}
....然後用
dothing {1..3}
生產
1
2
3
當然,這可以透過直接實現printf '%s\n' {1..3}
...
答案2
為什麼不創建另一個執行別名的函數?
function execute_all_aliases{
alias1
alias2
alias3
}
答案3
你總是可以這樣做:
eval echo{1..3}\;
也就是說告訴 shell 評估 shell 程式碼的擴展,即評估:
echo1; echo2; echo3;
其他一些變體:
eval echo{1..3}$'\n' # separate with newline instead of ;. Can make a
# difference for things like alias echo1='echo x|'
# alias echo2='tr x y'
eval echo{1..3}'&&' : # only run the next one if the previous one succeeded
答案4
感謝@Kusalananda,我想出了以下解決方案:
printf '%s\n' {1..3} | xargs -I {} bash -ic "echo{}"
這樣就達到了執行n個與其他指令部分依序命名的別名的目標