次のスクリプトを実行するとき
#!/usr/bin/env bash
main() {
shopt -s expand_aliases
alias Hi='echo "Hi from alias"'
Hi # Should Execute the alias
\Hi # Should Execute the function
"Hi"
}
function Hi() {
echo "Hi from function"
}
main "$@"
関数を最初に実行してから、常にエイリアスとして実行します。
$ . Sample.sh
Hi from function
Hi from function
Hi from function
$ . Sample.sh
Hi from alias
Hi from function
Hi from function
なぜですか?
次の場合、これは発生しません。
#!/usr/bin/env bash
function Hi() {
echo "Hi from function"
}
shopt -s expand_aliases
alias Hi='echo "Hi from alias"'
Hi # Should Execute the alias
\Hi # Should Execute the function
"Hi"
関数を最初に実行してから、常にエイリアスとして実行します。
$ . Sample.sh
Hi from alias
Hi from function
Hi from function
$ . Sample.sh
Hi from alias
Hi from function
Hi from function
ベストアンサー1
関数内のエイリアス拡張は、関数が実行されるのではなく、関数を読み取るときに行われます。関数のエイリアス定義は、関数の実行時に実行されます。
バラよりエイリアスと機能
そしてhttps://www.gnu.org/software/bash/manual/html_node/Aliases.html
これは、関数の実行時にエイリアスが定義main
されますが、関数を最初に読み込んだときにエイリアスがまだ定義されていないことを意味します。したがって、最初の関数は関数を3回main
実行します。Hi
スクリプトを2番目にインポートすると、エイリアスは以前の実行ですでに定義されており、関数定義を読み取ると拡張できます。今関数を呼び出すと、拡張エイリアスとして実行されます。
. Sample.sh
他の動作はスクリプトの起動時にのみ発生します。つまり、同じシェルで複数回実行されます。別のシェルで実行すると、./Sample.sh
常に最初の実行の動作が表示されます。