#!/usr/bin/env bash
スクリプトは通常、実行に使用するシェルを指定するshebangで始まります。 shebangが存在しない場合の実行動作は次のとおりです。シェルが呼び出されるまで。いずれにしても、スクリプトは、シェルで定義された変数と関数を呼び出す方法がわからない「新しい」シェルで実行されます。
あるいは、source
スクリプトをシェルに入れることもできます。これは、スクリプトの内容を現在のシェルにコピーして貼り付けるのと同じです。関数または変数がスクリプトで定義されている場合は、「実行」後も呼び出しシェルに残るため、望ましくない可能性があります。
これら2つのオプションの間に関係がありますか?スクリプトを呼び出しシェルのサブシェルとして実行して、呼び出しシェルで定義されているすべてのエントリにアクセスできますが、変更しないようにすることはできますか(export
そのようなコマンドを使用しない限り)。
執筆は(source myscript.sh)
私が求めているようだった。それが正しいことでしたか?同じ動作を生成するために呼び出すことができる同等のshebangはありますか./myscript.sh
?
ベストアンサー1
(. ./myscript.sh)
正しい方法です(標準型は.
、ではないsource
、).
で指定されたディレクトリは検索されませんPATH
。
shebangを使用してこれを行うには、親スクリプトを実行しているシェルのバイナリを見つけるための安定した方法が必要です。いいえ環境変数によって異なります。 Linuxでは、/proc/parent
次のことを想像できます。/proc/self
、親プロセスを指すと書くことができます。
#! /proc/parent/exe -
シェルスクリプトが親プロセスが実行されているバイナリを使用するようにします。 (これは元のシェルが削除または置き換えられても機能し、/proc/self/exe
バイナリが削除されても動作し、/proc/parent/exe
同じ方法で実行されます。)しかし、スクリプト自体を実行するために盲目的に親プロセスのバイナリに依存することは信頼できません(親プロセスは子プロセスが始まると死んで競争が発生します)。