シェルスクリプトを実行する2種類の方法とその違い - 4月 30, 2020 こんにちは、ぐぐりら(@guglilac)です。 ```bash ./シェルスクリプト名.sh ``` という方法と、 ```bash source ./シェルスクリプト名.sh ``` がある。 前者について、 `#!/bin/bash`がシェルスクリプトの先頭行についているけど、これは、ターミナルで ```bash ./シェルスクリプト名.sh ``` とすると、自動で ```bash /bin/bash シェルスクリプト名.sh ``` を実行してくれるということ。 なので、子プロセスとして新しくbashを起動してシェルスクリプトに書かれているコマンドを実行してくれる。 処理が終わると抜ける。 前者に関して言うと、シェル変数と環境変数の違いとして、 呼び出し元のシェルで使っていたシェル変数も、子プロセスのシェルでは参照できないが、 環境変数に指定すれば、子プロセスのシェルでも参照できるといった点が挙げられる。 シェルスクリプトを実行するもう一つの方法は、`source`コマンドを使ってシェルスクリプトを読み込む方法。 これは前者の方法と異なり、新しくシェルを起動するのではなく、現在のシェルでシェルスクリプトに書かれたコマンドを一つ一つ実行する。 なので、前者の方法で実行したシェルスクリプトが終わると、起動していたbashも終わるので、元のbashではシェルスクリプトで使っていたシェル変数は参照できないが、後者の方法であれば同じシェルにいるのでシェル変数はまだ残っている。 新しくシェルを起動する前者の方が、副作用を起こさないとか、呼び出し元のシェルのシェル変数が予期せぬ影響を与えたりといったことが起こらないため、基本的にはこちらの方が望ましい。 後者のようにシェルスクリプトの読み込みに`source`コマンドが使われている有名な例では、ログイン時に読み込まれる`.bash_profile`の中で`.bashrc`を読みこむ処理がある。 `.bashrc`もシェルスクリプトなわけだけど、これをログインシェルと異なる他のbashを起動して実行しては、ログインシェルに影響が残ってくれず、ログインシェルの設定(エイリアスとか)を行う`.bashrc`の目的を果たせない。 なので、`.bashrc`の実行には`source`を使う、というわけでした。 この記事をシェアする Twitter Facebook Google+ B!はてブ Pocket Feedly コメント
コメント
コメントを投稿