順番に番号付けされたエイリアスを繰り返すには?

順番に番号付けされたエイリアスを繰り返すには?

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

解決策:Kusalalanandaの答えに基づいています。

 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エイリアスは現在シェルセッションにローカルであるため、試行は機能しません。

あなたの最初のことは

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

関連情報