期待どおりに機能しないファイル権限を適用するのは混乱しています。おそらく私の予想が間違っていたからです。それでも:
簡略化のため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 s
?zsh s
答え1
実行時に./s
カーネルにプログラムを実行するように指示しますs
。実行権限がある場合、カーネルはファイルの最初の数バイトを読み取り、行をチェックしてスクリプトであることを確認し、インタプリタを実行して#!
スクリプト名を最初の引数として渡します。実行権限がない場合、カーネルは最初のステップで実行を中止します。
を実行すると、をzsh s
実行しzsh
、呼び出されたファイルを読み取り、s
コマンドとして解釈するように指示します。あなたは公演をしているのではなくs
、公演をしているのですzsh
。sh s
または と同じですcat s
。
再実行すると、source s
zshにファイルを読み取るように指示するため、ファイルに対する読み取り権限があることが重要です。