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