ファイルを実行する時のUNIX/Linux各コマンドの違い
- <ファイル名>
- exec <ファイル名>
- ./<ファイル名>
- . <ファイル名>
ふと疑問に思ったので調べた。
<実行ファイル名>と exec <実行ファイル名>の違い
まず、Linuxなどで実行可能な形式にコンパイルされたファイルを実行する場合、2通りの実行方法がある。 ひとつは、そのファイル名を打ち込んでEnter。 もうひとつはexecコマンドを使用する方法。
違いは、子プロセスを使用するかどうかにある。(というか今知った その違いを確かめるのによく使われるのが、以下のコマンド。
exec ls
通常、lsコマンドを打つとカレントディレクトリのファイルやディレクトリが一覧表示される。 で、exec ls と打つとlsコマンドが実行された後、開いていたシェルが閉じられる。 なので、execコマンドは「新規プロセスを作成せずに実行」っていうことがわかる。
〜↓ここからは僕自身が勘違いしていたので覚え直しに〜
./<実行ファイル名>
よく、./configure とかで見かける"./"。 Linuxで使いたいソフトウェアとかインターネット上で見つけては拾ってきて自分でmakeするときとか。 恥ずかしながら、ここで僕は大きな勘違いをしていました。
configureファイルって実行ファイルかと思ってたんですが、make用のスクリプトファイルだったんですね(´・ω・`)
ちなみに、Linux向けのIntelliJを公式からダウンロードして使う場合も、./<intellij.sh> みたいにシェルスクリプトを実行して起動します。 で、”./”はシェルスクリプトを実行するときのコマンドなのかな、と思いきや、ただカレントディレクトリのパスを指定しているだけのようでした。 パスに関係しないシェルスクリプトを実行するだけなら"./"を使わなくても良かったんですね。
逆に、対象となるスクリプト内にパスを通す必要があれば./<スクリプトファイル名>で実行。
exec <実行ファイル名>と. <実行ファイル名>の違い
次に、execコマンドと.(ドットコマンド)。 これも自分が勘違いして実行ファイルを実行するためのコマンドだと思ってたんですが、
. ./<スクリプトファイル>
と、コマンドを打つと、「カレントディレクトリの<スクリプトファイル>内の関数/変数をシェルに読み込む」でした。
普段何気なく使っているコマンドも、いざ調べてみると初歩的なことを見落としていたことに気付かされました(´・ω・`)
参考にしたサイト: