(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

シェルスクリプトに実行権限だけ与えても実行はできない

スポンサーリンク

はじめに

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

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

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

実行権限の話

前提

まず、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を例にしましたが 平文で書かれているシェルは読み取り権限がないと実行できません。
ただし、バイナリファイルの場合は実行権限のみでも動かせるというのも併せて覚えておくとどこかで役立つやもしれません。

以上、シェルスクリプトに関する実行権限のお話でした。

権限に関する関連記事