0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

シェルスクリプトの実行方法備忘録

Posted at

はじめに

シェルで実行するコマンドをあらかじめファイルにまとめたものがシェルスクリプトですが、一種のプログラミング言語であると言われることもあるシェルスクリプトの複数の実行方法について勉強したことを自分の備忘録として残しておきます。

シバンについて

初めてシェルスクリプトを見たときに謎だったのがシバンと呼ばれるおまじないです。

test.sh
#!/bin/bash

ls -alF

この1行目に書かれている#!/bin/bashシバンと呼ばれるもので、
「このシェルスクリプトは/bin/bashで動かします」、という宣言になるそうです。
#から始まっているため、コメント行という扱いです。

シェル
% ./test.sh

と実行すると、シバンのおかげで実質的には以下のコマンドとして実行されます。

シェル
% /bin/bash ./test.sh

以下のようにシェルの引数として実行する場合と同じ動作となります。

シェル
% bash test.sh

普段、自分はmacでzshを使っていますが、シェルスクリプトに上記のようなシバンを書くことにより、zshからbashスクリプトを直接実行できるということですね。

sourceコマンドと.コマンド

先ほどのように、相対パスでファイル名を指定してシェルスクリプトを実行する方法以外だと、
sourceコマンドを使ってシェルスクリプトを実行することができます。
ここで初見殺しなのが、ファイル名指定による実行とsourceコマンドによる実行では、動作が変わるということです。
sourceコマンドは、指定したファイル(シェルスクリプト)に書かれているコマンドを1行ずつコマンドラインに入力して実行するときと同じように実行されるそうです。最初はへぇそーなんだぐらいにしか思ってませんでしたが、ここが意外と重要ポイントらしく、sourceコマンドを使うと今自分が使っているシェル(カレントシェル)においてコマンドが実行されるため、シェルスクリプトにシバンは必要ないとのことです。しかも、もし仮にシェルスクリプトにシバンが書いてあったとしても、sourceコマンドを使った場合はコメント行として無視されます。また、シェルスクリプトは実行されるファイルであるため、

シェル
% chmod +x test.sh

というように、ファイルに実行権限がいるのですが、sourceコマンドではシェルスクリプトを直接実行するわけではないため、ファイルに実行権限がなくても問題ないです。

そして僕が一番ハマったのは、sourceコマンドと同じ意味を持つ.コマンドです。

シェル
% source ./test.sh
% . ./test.sh

この2つの実行結果は同じらしいのですが、初めて見たときに.がコマンドとは思わなかったですね。。カレントディレクトリか何かだと思ってました...。

カレントシェル or サブシェル

sourceコマンドを使うと、カレントシェルでシェルスクリプトが実行されるのに対して、ファイル名だけ指定して実行した場合はカレントシェルで実行されないのかと思ったのですが、この場合はサブシェルでシェルスクリプトが実行されるそうです。サブシェルとは、カレントシェルから新しく起動される子プロセスのシェルのことです。

test.sh
#!/bin/bash

ls -alF
シェル
% ./test.sh

これを実行すると、シバンに指定したbashがサブシェルとして起動され、サブシェルにてlsコマンドが実行され、実行後にはもとのカレントシェルに戻るそうです。カレントシェルとサブシェルは別物のため、環境変数は引き継がれるものの、エイリアスなどの設定は引き継がれないようです。

逆に、sourceコマンドではカレントシェルで実行するため、エイリアスの登録などのシェルスクリプトを実行すると、実行後にエイリアスがカレントシェルに登録されることになります。ファイル名だけ指定して実行するとサブシェルにエイリアスが登録されてカレントシェルに戻るので、カレントシェルには何の影響も及ぼさない結果となります。
そのため、シェルにログインする際に読み込まれる環境設定ファイル.bashrcなどのシェルスクリプトは、設定変更した後にわざわざログインし直す必要はなく、

シェル
% source ~/.bashrc

と実行すれば、変更した設定をすぐにカレントシェルに反映することができます。

まとめ

シェルスクリプトは実行する方法によって動作が変わるということを学びました。
まさか複数の実行パターンがあるとは思ってませんでした...。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?