web-dev-qa-db-ja.com

zshでのスクリプトの実行-ファイルのアクセス許可

実行ファイルのアクセス許可が期待どおりに動作しないことについて混乱しています。おそらく私の期待が間違っているからでしょう。とにかく:

スクリプトファイルがあります。簡単にするために、sと呼ばれ、~/binにあります。この例では、ファイルに次の行のみが含まれています。

#!/bin/zsh
echo "Test";

とても簡単です。

私は~/binディレクトリに移動し、chmod _sから400へのファイルアクセス権を付与します。つまり、自分専用の読み取り専用です。実行権限がありません。そこで、パスを入力してスクリプトを実行してみます。

% ./s
zsh: permission denied: ./s

ここまでは順調ですね。権限が正しくないため、ファイルを実行できません。 500(実行権限が付与されている)までのアクセス許可のバンピングも正常に機能します。これらのアクセス許可を使用すると、ファイルは正常に実行されます。

% ./s
Test

これはすべて予想通りです。しかし、私はchmod権限を400に戻し(もう一度権限を実行しない)、ファイルをsourceingしようとすると、次のようになります。

% source s
Test

権限は400ですが、スクリプトが実行されます。

だからここに私の質問があります:なぜ./sは失敗するのでしょう(あるべきように)が、source sは正常に実行されますか?これは実行許可の目的全体を無効にしませんか?

400権限では、sh sおよびzsh sも機能します。

私はどこかでひどく間違っていることをしている、または理解していると確信しています。誰かが私にどこを指摘し、./ssource ssh szsh sの違いを説明できますか?

17
C106

./sを実行すると、プログラムにsを実行するようにカーネルに指示します。実行権限がある場合、カーネルはファイルの最初の数バイトを読み取り、#!行を確認してこれがスクリプトであることを認識し、インタープリターを実行して、最初の引数としてスクリプト名を渡します。実行権限がない場合、カーネルは最初のステップで実行を中止します。

zsh sを実行すると、zshを実行し、sというファイルを読み取ってコマンドとして解釈するように指示します。 sを実行しているのではなく、zshを実行しています。 sh sまたはcat sでも同様です。

source sを実行すると、再びzshにファイルの読み取りを指示するので、重要なのは、そのファイルに対する読み取り権限があることです。