実行ファイルのアクセス許可が期待どおりに動作しないことについて混乱しています。おそらく私の期待が間違っているからでしょう。とにかく:
スクリプトファイルがあります。簡単にするために、s
と呼ばれ、~/bin
にあります。この例では、ファイルに次の行のみが含まれています。
#!/bin/zsh
echo "Test";
とても簡単です。
私は~/bin
ディレクトリに移動し、chmod
_s
から400
へのファイルアクセス権を付与します。つまり、自分専用の読み取り専用です。実行権限がありません。そこで、パスを入力してスクリプトを実行してみます。
% ./s
zsh: permission denied: ./s
ここまでは順調ですね。権限が正しくないため、ファイルを実行できません。 500
(実行権限が付与されている)までのアクセス許可のバンピングも正常に機能します。これらのアクセス許可を使用すると、ファイルは正常に実行されます。
% ./s
Test
これはすべて予想通りです。しかし、私はchmod
権限を400
に戻し(もう一度権限を実行しない)、ファイルをsource
ingしようとすると、次のようになります。
% source s
Test
権限は400
ですが、スクリプトが実行されます。
だからここに私の質問があります:なぜ./s
は失敗するのでしょう(あるべきように)が、source s
は正常に実行されますか?これは実行許可の目的全体を無効にしませんか?
400
権限では、sh s
およびzsh s
も機能します。
私はどこかでひどく間違っていることをしている、または理解していると確信しています。誰かが私にどこを指摘し、./s
、source s
、sh s
とzsh s
の違いを説明できますか?
./s
を実行すると、プログラムにs
を実行するようにカーネルに指示します。実行権限がある場合、カーネルはファイルの最初の数バイトを読み取り、#!
行を確認してこれがスクリプトであることを認識し、インタープリターを実行して、最初の引数としてスクリプト名を渡します。実行権限がない場合、カーネルは最初のステップで実行を中止します。
zsh s
を実行すると、zsh
を実行し、s
というファイルを読み取ってコマンドとして解釈するように指示します。 s
を実行しているのではなく、zsh
を実行しています。 sh s
またはcat s
でも同様です。
source s
を実行すると、再びzshにファイルの読み取りを指示するので、重要なのは、そのファイルに対する読み取り権限があることです。