Bashスクリプトの予期しない動作:関数が最初に実行され、次にエイリアスが実行される

Bashスクリプトの予期しない動作:関数が最初に実行され、次にエイリアスが実行される

次のスクリプトを実行するとき

#!/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常に最初の実行の動作が表示されます。

おすすめ記事