連番のエイリアスを循環させるにはどうすればよいでしょうか?

連番のエイリアスを循環させるにはどうすればよいでしょうか?

エイリアスは3つあります。名前はecho1、echo2、echo3です。

これら 3 つすべてを、より大きなコマンドの一部として実行するにはどうすればよいですか?

$ 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に評価されます。echo1i=1エイリアスの拡張。

文字列をエイリアスとして使用できるようにするには、結果の文字列を再評価する必要があります。

for i in 1 2 3; do
    eval "echo$i"
done

もしecho1echo2そしてecho3シェル関数eval必要ありませんでした (Bash 4.4 でテスト済み)。

bash -cエイリアスは現在のシェル セッションに対してローカルであるため、の試行は機能しません。

あなたの最初のもの

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}\;

これは、シェルにその展開をシェル コードとして評価するように指示します。つまり、次のように評価します。

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個のエイリアスを実行するという目的が達成されます。

関連情報