如何循環顯示依序編號的別名?

如何循環顯示依序編號的別名?

我有 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

如果echo1echo2並且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個與其他指令部分依序命名的別名的目標

相關內容