(O+P)ut

(O+P)ut

(O+P)ut = Out + Put >> OutPut

【Linux】シェルに実行権限だけ与えても実行はできない

はじめに

結論から言えば、タイトルの通りです。

シェルスクリプトに実行権限のみ与えても実行はできないです。

こちらの事象について気になって調べた際に、結論になかなか辿り着けなかったので記事にしました。

実行権限の話

前提

まず、Linuxでは 読み取り(r) 書き込み(w) 実行(x) それぞれの権限を chmodコマンドで変更できます。

f:id:mtiit:20180215145929p:plain

つまり、上記画像のように8通りの組み合わせがあるわけです。

テスト用シェルスクリプトを用意

今回、解説のために下記のスクリプト(test.sh)を用意しました。

#!/bin/bash
echo "Hello!"

画面に Hello! と表示するだけのスクリプトです。

読み取り権限

読み取り権限があるということは、簡単に言えばcatができます。

$ cat test.sh
#!/bin/bash
echo "Hello!"
書き込み権限

書き込み権限があるということは、簡単に言えば echoで追記ができます。

$ echo "# memo" >> test.sh

※最終行に # memo という行ができています。

実行権限

実行権限があるということは、言葉の通り実行できます。

$ ./test.sh
Hello!

実際にやってみた

no permisioonsの状態で上記3つを試せば下記のようにエラーが返ってきます。

$ chmod 000 test.sh

$ cat test.sh
cat: test.sh: Permission denied

$ echo "# memo" >> test.sh
-bash: test.sh: Permission denied

$ ./test.sh
-bash: ./test.sh: Permission denied

当たり前ですが、何もできません。


基本的に、r をつければ catが、wをつければ echo>>が、xをつければ実行ができますが、
rがない状態でのxは、無効となります。


下記で確認できます。

$ chmod 100 test.sh

$ ./test.sh
bash: ./test.sh: Permission denied

ちなみに、rがない状態でのwは、無効になりません。

$ chmod 200 test.sh

$ echo "# memo" >> test.sh

catで確認はできませんが、権限を与えて見てみるときちんと書き込まれています。


つまり、上記を鑑みると、シェルに関してはさきほどの画像は、下記となるように思えます。
f:id:mtiit:20180215151720p:plain


test.shを例にしましたが 平文で書かれているシェルを  only execute  の状態で実行するための設定はあるんですかね?*1ご存知な方はコメントにていただければ幸いです。

以上、ご参考ください。

*1:バイナリファイルの場合は、実行権限のみでも動かせるようです。