重複の可能性:
使用'。 'Bashでファイルを実行する
.bashrcファイルを変更せずにスクリプトを介して環境をエクスポートする方法を見つけようとしています。
私が見つけたこの古い便利な投稿それは言った:
変数はスレーブプロセスにのみエクスポートでき、親プロセスに戻すことはできません。スクリプトが親シェルの環境に影響を与えるようにするには、スクリプトを実行します。
. ./yourprogram
. ./script
との違いが何なのか知りたいです./script
。
私が見たときに現在のディレクトリからスクリプトを実行することは私にとって何を意味しますか?
答え1
./script
その場所で「script」というファイルを実行します./
。これは「ここ」(つまり、現在のディレクトリ)に変換されます。スクリプトはサブシェルで実行され、サブシェルが終了すると、スクリプトが環境で実行したすべての操作が失われます。
. ./script
./
現在のシェルに「script」というファイルを実行するように指示します。現在のシェルにはサブシェルがないため、環境で行われたすべての変更はスクリプトが停止しても保持されます。
.
コマンドの略語ですsource
。 man()を使用してソースコードを見つけることができますman source
。
/home/bob/script
./script
まるであなたがディレクトリにいると思います。/home/bob
. /home/bob/script
. ./script
まるであなたがディレクトリにいると思います。/home/bob
答え2
./script
script
これは、現在のディレクトリでファイルを実行していることを意味します。通常、スクリプトを実行すると最初にシェルが呼び出されますfork()
。exec()
つまり、スクリプトはサブプロセス(つまりサブシェル)で実行されます。
. ./script
これは、source ./script
現在のシェルでスクリプトを実行せずに実行することを意味します。fork()
答え3
最初はシェルコマンドで、.
次はパスです。二つ目はただの道です。
シェルコマンドは、.
後続のファイルを現在のシェルセッションに「ソース」します。したがって、設定された変数は./yourprogram
実行中のセッションまたはスクリプトに表示されます. ./yourprogram
。
一方、2番目のコマンドは単に./yourprogram
実行を要求します。これは適切な実行権限がある場合にのみ機能./yourprogram
します。
- バイナリファイル
#!/bin/sh
または、「shebang」行で始まる言語のスクリプト#!/usr/bin/python
- または、現在のシェル言語のスクリプトにshebang行がありませんが、この場合、現在のシェルはデフォルトでサブシェルからスクリプトファイルを実行します。
./yourprogram
これらのイベント中は、呼び出しスクリプトまたはセッションにシェル/環境変数への変更は表示されません。