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