
71.tmpディレクトリの話2
ナックス「今日はtmpディレクトリの話その2です」
デビー君「はーい」
ナックス「『というか、まずそもそも一般ユーザーで本当に/tmpディレクトリに書き込めるの?私はパーミッションの表示を信じない』という、全てを疑う人間のために、一般ユーザーでtmpディレクトリに書き込みしてみようぜ!」
デビー君「オッケー!」
ナックス「せっかくなので、色々復習しながら書き込んでみます。CUI環境を立ち上げましょう(真のCUI環境じゃなくて大丈夫です)」
デビー君「CUI環境を立ち上げた直後だから、今は一般ユーザーでホームディレクトリにいるね」
ナックス「まずはechoコマンドの復習」
$ echo こんにちは こんにちは
デビー君「echoコマンドは、指定した文字列をそのまま表示するコマンドだね。30.シェルスクリプトでプログラミングする前の予習。echoコマンド。exprコマンド。\によるエスケープ処理。でやったね」
ナックス「そうです。正確には『標準出力に指定した文字を表示する』です」
デビー君「ひょうじゅんしゅつりょく?」
ナックス「そうです。標準出力っていうのは『コマンドの結果が出る場所』のことです」
デビー君「『コマンドの結果が出る場所に、指定した文字を表示する』ってそれ、当たり前じゃない?わざわざ標準出力なんて言う難しい言葉を使わなくても……」
ナックス「そうですね。次は、echoコマンドで指定した文字を > でファイルに書き込んでみます」
$ echo こんにちは > aaa.txt
デビー君「>を使うと、バシッと書き込めるんだっけ?」
ナックス「そうです。正確に言えば『標準出力』を『PCのディスプレイ』から『指定したファイル』にリダイレクトしているのです」
デビー君「なにいきなり専門用語をバンバン出してるの?バカなの?」
ナックス「つまり、実は > はリダイレクトの機能を持つのです」
デビー君「なに無視してるの?バカなの?」
ナックス「落ち着いて読めば大丈夫ですよ、デビー君。わかりやすく処理の流れを以下に書きました」
- 「echo こんにちは」で、標準出力(PCのディスプレイ)に"こんにちは"と表示しようとする
- 「> aaa.txt」で、標準出力先を aaa.txt というファイルに変更(リダイレクト)する
- aaa.txt に こんにちは が書き込まれる。
ナックス「ね?そんなに難しくないでしょ?」
デビー君「うん、まあ」
ナックス「というわけでcatコマンドでaaa.txtファイルの中身を見てみましょう」
デビー君「catコマンドはファイルの中身を見るコマンドだったね」
$ cat aaa.txt こんにちは
ナックス「ね?『こんにちは』って書かれてる」
デビー君「うん」
ナックス「せっかくなので追加書き込みも復習しましょう。以下のコマンドを使用してみてください」
$ echo こんばんは >> aaa.txt
ナックス「catコマンドで見てみましょう」
$ cat aaa.txt こんにちは こんばんは
ナックス「>> を使用することで、既存のファイルの下に追加書き込みができます。では、既に文字が書かれているファイルに追加書き込みではなく普通のリダイレクトを使うとどうなるのでしょう?」
$ echo おはよう > aaa.txt
ナックス「中身を見てみましょう」
$ cat aaa.txt おはよう
ナックス「既に何か文字が書かれているファイルにリダイレクトで文字を書き込むと、既存の内容を無視して上書き保存、つまり、『こんにちは』と『こんばんは』が消されて、『おはよう』が書き込まれます」
ナックス「ちなみに、存在しないファイルに追加書き込みをすると」
$ echo こんにちは >> bbb.txt
ナックス「特に問題なく新しいファイルが作られ、文字も普通に書かれます」
$ cat bbb.txt こんにちは
ナックス「ここまでは復習です。ただ、専門用語を使って難しそうに言っただけです」
デビー君「専門用語必要なの?」
ナックス「必要です。こうやって初心者を脅すことで、いかにも凄そうなことをしているイメージを刷り込み、いつか素人からプログラムで何か依頼をもらった時に莫大な金額を要求するために必要です」
デビー君「よーし、僕も大人になったら法外な金額を請求するぞ!」
ナックス「さて、遂に一般ユーザーから/tmpディレクトリにファイルを書き込みます。以下のコマンドを打ってみてください」
$ echo こんにちは > /tmp/ccc.txt
デビー君「おお。確かにエラーが出ない」
ナックス「何をやってるかは分かると思います」
デビー君「うん。/tmpディレクトリの中にccc.txtファイルを作って、中に『こんにちは』って書かれてるんでしょ」
ナックス「まずはlsコマンドで/tmpディレクトリの中にccc.txtファイルが存在することを確認しましょう」
$ ls /tmp ccc.txt
デビー君「あるね。ccc.txtファイルができてる」
ナックス「念の為ccc.txtファイルの中身を確認してみましょう」
$ cat /tmp/ccc.txt こんにちは
デビー君「おお、こんにちは、ってちゃんと書かれてる」
ナックス「これで、この世のありとあらゆる事に疑いの目を向ける皆さんも、一般ユーザーで/tmpディレクトリに書き込むことが出来ることがご理解いただけたと思います」
デビー君「うん」
ナックス「だがしかし──。/tmpディレクトリは、テンポラリファイルを置くためのディレクトリ。きっと私達が作成するプログラム以外のプログラムも、/tmpディレクトリの中にテンポラリファイルをバリバリ作成することでしょう」
デビー君「うん」
ナックス「じゃあ、運が悪いと私達が作成するテンポラリファイルのファイル名と、他のプログラムが作成するテンポラリファイルのファイル名がバッティングしちゃわない?」
デビー君「そんなことあるの?」
ナックス「そんなことあるよ」
デビー君「プログラムの作成ってそこまで考えて作るの?」
ナックス「プログラムの作成ってそこまで考えて作るんだよ」
ナックス「しかし、そこはLinux。絶対に他のファイルとファイル名がかぶらない、何も書かれていないファイルを作成するコマンドが用意されています。mktempコマンドです」
- mktemp
一時ファイルや一時ディレクトリを作成する。
- 一時ファイルを作成する
$ mktemp
- 一時ディレクトリを作成する
$ mktemp -d
ナックス「実際に私がmktempコマンドを試してみたところ、こんな感じでした」
$ mktemp /tmp/tmp.Tv5zhSIZuI
デビー君「mktempってコマンドを打つだけで/tmpディレクトリの下に、他とは絶対に名前のかぶらないファイル、今回の例では『tmp.Tv5zhSIZuI』が作成される……楽勝じゃないか!」
ナックス「そうですね。で、実際にはこのファイルに情報を書き込むときはリダイレクトとか追加書き込みを使用すれば良いのです」
ナックス「さて、今回作成した色々なファイルは特に今後使う予定はないので、削除しちゃって大丈夫です」
ナックス「次回!72.tmpディレクトリの話3」
デビー君「まだあるの?」