echo("備忘録");

IT技術やプログラミング関連など、技術系の事を備忘録的にまとめています。

【Linux】パーミッションによるコマンドやスクリプトの動作の違い

昨日(2018/01/20)、豊橋市で行われた「ブイアールサンダー」というVR(XR)関連のイベントに参加しました。
XR関連の知識が得られたのも大きいですが、何より大学時代の思い出の地、豊橋でIT関連のイベントが開かれたというのが嬉しかったです。

僕は豊橋市民ではないですが、豊橋市のこういうイベントには積極的に参加&協力したいな、と心から思いました。(てか、懇親会に参加できなかったのが、今でも悔やまれる...)
uzura.doorkeeper.jp

さて、10月から参画しているプロジェクトでガッツリUnixLinuxに触れることになり、その関係でシェルスクリプト(shやbash)もバリバリ書いています。
最初は戸惑いましたが、決して難易度は高くないし、慣れると快適ですね。
これからWindows Subsystem for Linuxもあることだし、Linuxに触れる機会もさらに多くなるでしょう。

で、先日仕事でシェルスクリプトを書いてて、下記の処理を書きまして(てかはてなブログって、'bash'はないのか…)

if [ -d ${dir} ]; then
    ## ディレクトリがある場合は書き込み権限のチェック
    if [ -w ${dir} ]; then
        echo "書き込み権限がある"
    else
        echo "書き込み権限がない"        
    fi
else
    ## ディレクトリがない場合
    echo "ディレクトリがない"
fi

これをあるディレクトリ(もちろん実在)で動かしたら、まあ上二つのどちらかだと思ったんですが、結果は

"ディレクトリがない"

だったんです。

で、「???」と思って調査したところ、どうやら'-d'や'-f'などはパーミッション次第では、実際のディレクトリ有無と違う動作になるらしく。
もっと調べると、ファイル&ディレクトリ関連のコマンドも、パーミッション次第で動作結果が異なる事がわかりました。

じゃあ...ってわけで、仕事が暇だったので実際に調べてみました。

その1.コマンド
※調べたコマンドは下記の通り

  • ls(フォルダなどの一覧表示)
  • cp(ファイルのコピペ)
  • mv((今回は)ファイルのカット&ペースト)
  • rm(ファイル削除)
  • touch(ファイルの新規作成)


【結果】

f:id:Makky12:20180121181816p:plain
lsコマンド
f:id:Makky12:20180121183141p:plain
cpコマンド
f:id:Makky12:20180121183151p:plain
mv&rm&touchコマンド

【結果】

  • 新規作成&削除は、対象ファイル自体の権限は全く関係なし。(ディレクトリの権限は「中のファイル自身」ファイルの権限は「そのファイルの中身」を扱う権限、ということなのかも)
  • 'cp'コマンドは、ちゃんとファイルの'r'権限も必要(「中身をコピーするから」という意味合い?)
  • 'mv'コマンドは、最初は'cp'と全く同じと思ったけど、「切り取り」は'rm'、「貼り付け」は'cp'と同様と考えると、確かに納得。


その2(本題).シェルスクリプト
※調べたスクリプトは「-d(ディレクトリ有無)」と「-e(ファイル有無)」で、下記スクリプトで確認。
※${dir}や${file}は確実に存在する、という前提。

if [ -d ${dir} ][ -e ${file} ]); then
    echo "true"
else
    ## ない場合
    echo "false"
fi


【結果】
※どちらも「対象ディレクトリ/ファイルの親フォルダ」の権限

f:id:Makky12:20180121181805p:plain
ファイル&ディレクト
【結論】

  • こちらも、そのディレクトリ&ファイル自体の権限は全く関係なし。(親ディレクトリの権限に依存)
  • '-e'は、0(≒true) or 1(≒false)だからまだいいけど、'-d'は権限がないとエラーになるから、判定が大変かも。(初めに'-d'('-e')の${?}(=ステータス)でエラー判断→エラーがなければ、次に実際の有無判断?でも'-d'('-e')を2回実行するのは、あまりスマートじゃないような...)
  • いずれにしろ、適切な権限がないと、実際のファイル有無と違う判定をする可能性がある。


結論として、ファイル関連の各種コマンドやシェルスクリプトの実行時には、パーミッション(特に親フォルダの)には要注意、という話でした。

終わり!閉廷!以上!解散!


■余談
 冒頭に書いた「ブイアールサンダー」の件ですが「半田市から…」と言ったら、めちゃくちゃ驚かれました。
豊橋の人からしたら、そんなに遠いですかね、半田~豊橋って。(今では一般道でも約1.5時間ですからね。昔はr41がなく、R247で行くしかなくて、2時間かかってましたから。早くなったものです。)