$ 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
ソーススクリプト内の定義はソーススクリプト自体で有効になりません。