昨日(2018/01/20)、豊橋市で行われた「ブイアールサンダー」というVR(XR)関連のイベントに参加しました。
XR関連の知識が得られたのも大きいですが、何より大学時代の思い出の地、豊橋でIT関連のイベントが開かれたというのが嬉しかったです。
僕は豊橋市民ではないですが、豊橋市のこういうイベントには積極的に参加&協力したいな、と心から思いました。(てか、懇親会に参加できなかったのが、今でも悔やまれる...)
uzura.doorkeeper.jp
さて、10月から参画しているプロジェクトでガッツリUnixやLinuxに触れることになり、その関係でシェルスクリプト(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(ファイルの新規作成)
【結果】
【結果】
- 新規作成&削除は、対象ファイル自体の権限は全く関係なし。(ディレクトリの権限は「中のファイル自身」ファイルの権限は「そのファイルの中身」を扱う権限、ということなのかも)
- 'cp'コマンドは、ちゃんとファイルの'r'権限も必要(「中身をコピーするから」という意味合い?)
- 'mv'コマンドは、最初は'cp'と全く同じと思ったけど、「切り取り」は'rm'、「貼り付け」は'cp'と同様と考えると、確かに納得。
その2(本題).シェルスクリプト
※調べたスクリプトは「-d(ディレクトリ有無)」と「-e(ファイル有無)」で、下記スクリプトで確認。
※${dir}や${file}は確実に存在する、という前提。
if [ -d ${dir} ]([ -e ${file} ]); then echo "true" else ## ない場合 echo "false" fi
【結果】
※どちらも「対象ディレクトリ/ファイルの親フォルダ」の権限【結論】
- こちらも、そのディレクトリ&ファイル自体の権限は全く関係なし。(親ディレクトリの権限に依存)
- '-e'は、0(≒true) or 1(≒false)だからまだいいけど、'-d'は権限がないとエラーになるから、判定が大変かも。(初めに'-d'('-e')の${?}(=ステータス)でエラー判断→エラーがなければ、次に実際の有無判断?でも'-d'('-e')を2回実行するのは、あまりスマートじゃないような...)
- いずれにしろ、適切な権限がないと、実際のファイル有無と違う判定をする可能性がある。
結論として、ファイル関連の各種コマンドやシェルスクリプトの実行時には、パーミッション(特に親フォルダの)には要注意、という話でした。
終わり!閉廷!以上!解散!
■余談
冒頭に書いた「ブイアールサンダー」の件ですが「半田市から…」と言ったら、めちゃくちゃ驚かれました。
豊橋の人からしたら、そんなに遠いですかね、半田~豊橋って。(今では一般道でも約1.5時間ですからね。昔はr41がなく、R247で行くしかなくて、2時間かかってましたから。早くなったものです。)