t
単純なスクリプトを使用すると、次の2つのケースの違いは何ですか?
$ . t
そして
$ ./t
答え1
. t
tを実行するために新しいシェルが開かないため、作成または変更されたすべての変数は実行後も保持されます。 t は $PATH から取得されるため、現在あるパスで t を実行する場合、コマンドは次のようになります。. ./t
./t
tが実行され、これはシェル実行を生成するパスにあります。
もう一度確認するため。 t に以下が含まれているとします。
#!/bin/bash
data=hello
後ろに./t
コマンドラインからこれを行うことができ、echo $data
何も取得できませんが、実行を続けると. ./t
画面echo $data
にグリーティングが表示されます。
答え2
$ . somescript.sh
この場合、theは.
theの同義語です。source
内蔵。これは、現在のシェルでそのコマンドを入力するのと同じように、引数(somescript.sh
私の場合はあなたのもの)を読みます。t
$ ./somescript.sh
somescript.sh
スクリプトは独自のシェルで実行されます。この場合、.
実行パスの相対部分として使用されます。 LinuxおよびUnix(およびBashがインストールされている場合はWindows)のBashでファイルを実行するには、実行可能ファイルのフルパスを指定する必要があります。./
パスの先頭を使用すると、Bash は現在のディレクトリを使用するように指示します。
2番目のケースは、Bashで実行可能ファイルを実行する方法です。最初の場合、ファイルはBashファイルでなければなりません。
答え3
同じシェルでスクリプトを実行するもう1つの重要な効果は、exit
コマンドが独自のシェルを終了することです。スクリプトに環境変数またはファイルが存在するかどうかを確認するのが一般的です。たとえば、次のようになります。
if [ -z $JAVA_HOME ]; then
echo "JAVA_HOME variable is not set. Exit..."
exit 1
fi
このスクリプトを使用するとsource
エラーを表示できません(JAVA_HOMEを設定していない場合)。端末が閉じるか、SSHセッションが終了します。または、これにより古いユーザーに戻りますsu
。
したがって、スクリプトをインポートするよりも、デフォルトでサブシェルでスクリプトを実行する方がよいでしょう。
答え4
ドットは.
現在のディレクトリを表しているため、t
if is内の単純なスクリプトは結果を提供し、存在しないエラーを生成します。/home/someuser
.t
/home/someusert
スラッシュは/
スクリプトに正しいパスを提供するため、./t
結果/home/someuser/t
、つまりスクリプトへの正しいパスを提供します。