Linuxとコマンドラインの基礎
カレントディレクトリにある実行の権限が付いたスクリプト run.sh を、「run.sh」と入力して実行しようとすると「command not found」になり、「./run.sh」と入力すると実行できた。理由として、正しいものはどれか。
- Arun.sh に実行の権限が付いておらず、先頭に ./ を付けたときだけは権限がなくても実行できるから
- Bスラッシュを含まないコマンド名は環境変数 PATH のディレクトリだけで探され、カレントディレクトリは一般に含まれないから
- Crun.sh の1行目の #!/bin/bash(シバン)は、先頭に ./ を付けて実行したときにしか読まれないから
答えと解説を見る
正解:B. スラッシュを含まないコマンド名は環境変数 PATH のディレクトリだけで探され、カレントディレクトリは一般に含まれないから
シェルは、スラッシュを含まないコマンド名を受け取ると、環境変数 PATH にコロンで区切って並んだディレクトリ(/usr/local/bin:/usr/bin など)を順に探して実行します。カレントディレクトリは、別の場所に置かれた同じ名前の悪意あるプログラムを誤って実行しないように、一般に PATH に入れません。./run.sh のようにスラッシュを含むパスを書くと、PATH を探さずにそのファイルを直接実行します。1行目の #!/bin/bash(シバン)は、どちらの方法で起動しても、そのスクリプトを実行するインタプリタを指定します。
- A. 実行の権限がなければ、./run.sh も「Permission denied」で実行できません。
- B. 正しい。カレントディレクトリは PATH に含まれていないので、./ で場所を示す必要があります。
- C. シバンは、PATH から見つけて起動した場合も ./ を付けて起動した場合もカーネルが読み、指定されたインタプリタでスクリプトを実行します。