「source x」、「」の違いは何ですか。x」と「./x」はバッシュで?


11

私はrun.sh次のように1つのbashソースを持っています、

#!/bin/bash
if [ $# -ne 1 ]; then
    exit
fi
...

2つの方法で実行すると、動作が異なります。最初の方法は、

source run.sh

実行後にターミナルを閉じます。第二の方法は、

./run.sh

これは単にスクリプトの実行を終了し、ターミナルにとどまります。source run.sh./run.sh実行の両方でbashスクリプトを終了するコマンドがあるかどうかを尋ねています。私も試してみましたreturnが、./run.sh実行してもうまくいきません。

より一般的には、私はこれがなぜ起こっているのか、そして「ソース」と「。」を使用することの違いに興味があります。スクリプトを実行するには?

回答:


16

回答する前に、いくつかの説明が必要だと思います。次の3行を分析してみましょう。

source run.sh
. run.sh
./run.sh

最初の2行はまったく同じです。.実際にはのエイリアスですsource。何source行うことはする呼び出し、したがって、現在のコンテキストでシェルスクリプトを実行しているexitシェルを終了します。

ただし、3行目(混乱を招く行)は他の行とは関係ありません。./run.shは単なるパスであり、(たとえば)/home/user/run.shまたはと同じ/usr/bin/somethingです。シェルのコマンドはスペースで区切られていることに注意してください。したがって、この場合、コマンドはではなく.、です./run.sh。つまり、サブシェルが実行され、exitサブシェルにのみ効果があります。


5

3つの方法:

スクリプトを関数で囲み、returnのみを使用できます。

#!/usr/bin/env bash
main() {
    ...
    return 1
    ...
}
main "$@"

スクリプトが対話型シェルによって供給されているかどうかをテストできます。

if [[ $- = *i* ]]; then
    return 1
else
    exit 1
fi

戻ることを試みることができ、失敗した場合は終了します。

return 1 2>/dev/null || exit 1

魔法の呪文がどのように機能するかについてのヒントはあり$- = *i* ますか?
deadbeef404 2016年

@ deadbeef404特別なパラメーター-は、現在アクティブなオプションフラグを保持します。テストでは、-iフラグがアクティブかどうかを確認します。gnu.org/software/bash/manual/html_node/Special-Parameters.htmlを
geirha

1

「source」コマンドを「include」ステートメントのように考えてください。引数の内容を受け取り、直接実行されたかのように実行します。この場合、コマンドは「source」で、引数は「run.sh」であり、run.shは、コマンドラインにrun.shの内容を入力した場合とまったく同じように実行されます。

「./run.sh」を実行すると、「./ run.sh」がコマンドであり、引数はありません。このファイルはバイナリテキストではなくプレーンテキストであるため、シェルはシバン(最初の行の「#!」)でインタープリターを探し、「/ bin / bash」を見つけます。したがって、シェルはbashの新しいインスタンスを開始し、run.shのコンテンツはこの新しいインスタンス内で実行されます。

最初の例では、bashが「exit」コマンドに到達すると、コマンドラインに入力した場合とまったく同じように実行されます。2番目のインスタンスでは、シェルが起動したbashプロセスで実行されるため、bashのこのインスタンスのみが「exit」コマンドを受け取ります。

bashに行を入力すると、最初のスペースより前の部分はコマンドとして扱われ、その後の部分は引数として扱われます。コマンド '。' 「ソース」のエイリアスです。あなたが実行したとき。run.sh ''。 ' スペースで引数と区切られているため、それ自体が独自のコマンドです。「./run.sh」を実行すると、コマンドは「./run.sh」と「。」になります。「。」を含むrun.shへの相対パスの一部です。現在のフォルダを表します。


シェル/ bashスクリプトの改善を目指すC / C ++プログラマーの場合、これが最適な答えです。
ジャスティン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.