インタラクティブなbashプロセスで得られたスクリプトのエイリアスが拡張されないのはなぜですか?

インタラクティブなbashプロセスで得られたスクリプトのエイリアスが拡張されないのはなぜですか?
$ alias bb=hello

$ cat test.sh 
#! /bin/bash

alias bb
echo "$bb"

$ ./test.sh 
./test.sh: line 3: alias: bb: not found

子bashプロセスが親bashプロセスからスクリプトエイリアスを継承しないためですか?

$ source ./test.sh 
alias bb='hello'

スクリプトの内容はbashプロセスで実行されるため、エイリアスが存在します。ただし、エイリアスは拡張されません。

Bashのマニュアルによると

シェルが非対話型の場合、Shoptを使用してExpand_aliasesシェルオプションを設定しない限り、エイリアスは拡張されません。

しかし、インポートされるスクリプトの内容はインタラクティブなbashプロセスで実行されますが、エイリアスが拡張されないのはなぜですか?

ありがとうございます。

答え1

スクリプトを実行すると

./test.sh

その後、現在の対話型シェルではなく、独自の非対話型シェルで実行されます。あなたはする必要があります

. ./test.sh

これは次のとおりです。

source ./test.sh

2番目の例では。

バラよりソース("."または"source")とbashでのファイル実行の違いは何ですか?

の場合、echo "$bb"パラメータ拡張エイリアスを拡張しないでください。:

ニックネーム単純なコマンドの最初の単語として使用すると、単語を文字列に置き換えることができます。

答え2

シェルスクリプトはサブシェルで実行されます(プロンプトを印刷する現在のプロセスではありません)。

シェルスクリプトの実行を予測可能にするために、スクリプトを実行する前にサブシェルからエイリアスがクリアされます。これが発生しない場合、スクリプトは未知のエイリアスを解釈し、アクティブなエイリアスに従ってすべての操作を実行できます。

警告:これはスクリプトを取得するとデフォルトのシェルに影響しますが、少なくとも遺伝的シェル(kshまたは同じ歴史的なBourne Shellソースに依存するシェルbosh)はスクリプトファイルを完全に解析します(すべての改行が数字全体で区切られているように)。ソーススクリプトでコードを実行する前に。これにより、aliasソーススクリプト内の定義はソーススクリプト自体で有効になりません。

関連情報