4

非インタラクティブシェルに戻る前に、.bashrcの一番上にこれがあります

FOO="BAR"; export FOO
echo "HELLO WORLD"

# If not running interactively, don't do anything
[ -z "$PS1" ] && return

ホームディレクトリに次のスクリプト test.sh があります。

#!/bin/bash
echo "A"
echo $FOO
echo "B"

test.sh を実行します。出力:

A

B

2 つの質問:

  • $FOO の値が表示されないのはなぜですか?
  • 「HELLO WORLD」が表示されないのはなぜですか?

編集: #!/bin/bash を使用したスクリプトは、.bashrc を再度呼び出すサブシェルをトリガーすると思いましたが、それは間違っていますか?

編集:別のホストからスクリプトを呼び出しても、値は表示されません。それでも、.bashrcは実行されますか???

ssh remotehost "/home/username/test.sh"
4

4 に答える 4

4

.bashrc非ログインの対話型シェルに対してのみ自動的に供給されます。多くの場合、ファイル. .bashrcの先頭近くに配置して、ログインおよび非ログインの対話型シェルの両方に供給されるようにします。.bash_login.bashrc

.bashrcシェル スクリプトの実行時に開始されるシェルなど、非対話型シェルの場合は自動的に供給されません。

FOOからエクスポートするため、 null値が表示.bashrcされているという事実は、ログイン シェルからスクリプトを実行していることを示しています。プロンプトから印刷されますか?もしそうなら、そしてそうでなければ、私は驚くでしょう。test.shFOOecho $FOOBARtest.sh

于 2013-06-20T18:46:38.623 に答える
3

再度ログインすると、bashrc が新しいログイン シェルで実行され、シェル スクリプトがログイン シェルから変数を継承しました。それが「環境変数」の意味です。子プロセスに渡される変数です。

スクリプトは別のプロセスで実行されますが、「サブシェル」という言葉は使用しません。( cmd1 ; cmd2 )サブシェルを作成して括弧内のものを実行するようなもののためにそれを予約します。シェル スクリプトを実行するexecと、インタープリターが新しくなります。これは、次のように重要な違いです。

x=foo # not exported
export y=bar

(
  # This subshell is a copy of the existing shell process, including the
  # non-exported variables, so x is still foo here.
  echo x is $x
  echo y is $y
  # But it's a copy, so modifications do not propagate to the parent.
  x=blah
  y=blah
) | sed 's/^/SUBSHELL: /'

# Back in the parent shell, x and y have not become blah.
echo PARENT: x is $x
echo PARENT: y is $y

# This is not a "subshell" but a new shell. It inherits the exported
# variable y, but not x. Running a shell script resembles this.
sh -c 'echo x is $x ; echo y is $y' | \
sed 's/^/NEWSHELL: /'
于 2013-06-21T08:55:02.367 に答える
1

答えは簡単です。正しい順序で解決する:

「HELLO WORLD」が表示されないのはなぜですか?

.bashrcwill は、すべてのコマンドで、またはサブシェルの起動時に解析されるわけではないことに注意してください。新しいシェルでのみ解析されます。マニュアルページから:

ログイン シェルではないインタラクティブ シェルが開始されると、bash は /etc/bash.bashrc および ~/.bashrc からコマンドを読み取り、実行します (これらのファイルが存在する場合)。

だから、あなたは処理されないと思います.bashrcsource ~/.bashrcスクリプトを実行する前に試しましたか? また、新しいターミナルを開くこともできます。

$FOO の値が表示されないのはなぜですか?

解析された場合bashrc、期待どおりに機能します。


一般的なアドバイス: のようなシェル コマンドで変数を使用している場合はecho、変数の名前を括弧で囲んで、変数の内容がシェル オプションとして扱われないようにします。そう

echo $FOO

する必要があります

echo "$FOO"
于 2013-06-20T16:48:49.443 に答える