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


16

私は期待どおりに動作しないファイルの実行権限について混乱しています。おそらく私の期待が間違っているためです。とにかく:

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

#!/bin/zsh
echo "Test";

とても簡単です。

私はに移動し~/bin、ディレクトリ、およびchmod、ファイルのパーミッションs400-すなわち、読み取り専用私のためだけ。実行許可なし。そのため、パスを入力してスクリプトを実行し、次のようにします。

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

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

% ./s
Test

これはすべて予想どおりです。しかし、その後、私は(再度許可を実行する)にchmod戻って許可を与え、ファイルを400試してみるsourceと、これが起こります:

% source s
Test

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

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

400権限、sh sおよびzsh sまた仕事。

私はどこか恐ろしく間違っていることをしている、または理解していると確信しています。缶誰かのポイント私に場所を、との違いを説明し./ssource ssh szsh s

回答:


17

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

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

source sもう一度実行すると、zshにファイルを読み取るように指示するため、重要なのはそのファイルに対する読み取り権限があることです。


さて、それは理にかなっています。しかし、それは実行許可を持つという点を完全に打ち負かしていないのでしょうか?設定されていてもいなくても、スクリプトをいつでも実行できます(または、zshにスクリプト内のコマンドを解釈するよう指示します。これは同等です)。
C106

また、cat sファイルの内容を印刷するだけです。cat s | zshに渡しzsh、印刷しTestます。
C106

1
@ C106実行許可のポイントは、ファイルが追加情報なしで実行できるものを表すことを示すことです。ファイルがsetuid / setgidであるかどうかも重要です。ファイルには実行許可がない場合もありますが、それでも何らかのコンピュータープログラムがどこかで実行されるという指示が含まれています。
ジル「SO-悪であるのをやめる」

それは非常に理にかなっており、実際、非常に明白です。ありがとう。
C106
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.