zshでスクリプトを実行する - ファイル権限

zshでスクリプトを実行する - ファイル権限

期待どおりに機能しないファイル権限を適用するのは混乱しています。おそらく私の予想が間違っていたからです。それでも:

簡略化のためsににあるスクリプトファイルがあります~/bin。この例の目的に応じて、ファイルには次の行のみが含まれます。

#!/bin/zsh
echo "Test";

とても簡単です。

~/binディレクトリに移動しましたが、chmodファイル権限はs読み取り400専用です。実行権限がありません。その後、そのパスを入力してスクリプトを実行しようとしましたが、次のような結果が出ました。

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

今まではそんなに良くなった。権限エラーのためファイルを実行できません。実行権限を付与して権限を上げることもうまく500機能します。これらの権限を使用すると、ファイルが正しく実行されます。

% ./s
Test

これはすべて予想されるものです。しかし、その後、権限をchmod復元し400(権限を再び解放)、sourceファイルを試しましたが、これが起こりました。

% source s
Test

権限にもかかわらず400スクリプトが実行されます。

だから私の質問は次のとおりです。なぜ./s失敗しますが(そうするべきかのように)source sうまく動作しますか?これは権限実行の全体的な目的を無効にしませんか?

400権限に応じて機能することsh sもできますzsh s

私はどこかで真剣に間違ったことをしているか理解していると確信しています。誰かが私に./s、とsource sの違いを教えて説明できますかsh szsh s

答え1

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

を実行すると、をzsh s実行しzsh、呼び出されたファイルを読み取り、sコマンドとして解釈するように指示します。あなたは公演をしているのではなくs、公演をしているのですzshsh sまたは と同じですcat s

再実行すると、source szshにファイルを読み取るように指示するため、ファイルに対する読み取り権限があることが重要です。

関連情報