Lから始まるLinux

2章32話
ファイルディスクリプタ
2章33話 ヒアドキュメント
もくじ
2章34話
パイプ
ヒアドキュメント
若木 みどり
お兄ちゃん! 出力リダイレクトには >>> があったけど 入力リダイレクトって < だけなのかな? << とかあってもよいんじゃないかなと思ったの
若木 しげる
実は << という リダイレクト記号があるよ でも >> のように追記の意味はないんだ これは「ヒアドキュメント(here document)」 と呼ばれているよ
若木 みどり(笑顔)
リダイレクトが便利だったので ヒアドキュメントも きっと役に立ちそうだね!
使い方
若木 しげる
ヒアドキュメントは 複数行のテキストを そのままコマンドの入力として 渡せる仕組みなんだ
若木 みどり
へぇ… それってどうやるのかな?
若木 しげる
以下を入力してみよう!
cat << EOF
若木 みどり
cat「ファイルの内容を表示」だよね何を表示してくれるんだろう?
> 
若木 みどり(驚き)
あれ?いつものプロンプト $ じゃなくて代わりに > が出てきたよ!
若木 しげる
これはまだコマンドが完了しておらず入力を待っている状態を表しているよ
若木 しげる
> に続けて好きな内容を何行か入力してみて
若木 みどり
こんな感じ?
> まいやひ
> まいやふ
> まいやほ
若木 しげる(笑顔)
いい感じだね!
若木 しげる
最後に入力の終わりを示す EOF を入れようEOF とだけ入力したら Enter だよ!
> EOF
若木 みどり
ここで Enter っと!
まいやひ
まいやふ
まいやほ
若木 みどり(驚き)
おおっ!これまで入力した内容がそのまま出力されたよ!まるで echo複数行版みたいだね!
若木 しげる
ヒアドキュメントは << の後に「終了を表す文字列」を指定することでその文字列が出るまでの全ての行をコマンドの入力として扱うんだよ
若木 みどり
ところで EOF ってどういう意味なのかな?
若木 しげる
EOF「End Of File(ファイルの終わり)」の略だよだけど実際はなんでもいいんだ「終わり」が分かりやすい単語なら使いやすいねEOI(End Of Input) や END を使う人も多いよ
若木 みどり
なるほど!EOF に限らず好きな文字列を「終了を表す文字列」にできるんだね
内容のクォート
若木 しげる
ヒアドキュメントの内容は「ダブルクォート(")」クォートしたような扱いになるよ
若木 みどり
「ゆるい」クォートだよね一部の特殊な記号しか意味を失わせてくれないんだ
若木 しげる
以下のようにすることでヒアドキュメントの内容を「きつく」クォートできるんだ
cat << \EOF
...
EOF
cat << 'EOF'
...
EOF
若木 みどり
へぇ!逆にいうとこの書き方をしなければ大部分の特別な記号はそのままの意味を持つんだね
若木 しげる
それが便利な場合もあるけど不都合ならクォートしてそのままの内容を出力させよう
出力リダイレクトとの組み合わせ
若木 しげる
じゃあちょっと発展的な使い方をしてみようか
若木 しげる
ヒアドキュメントを使って入力を作りつつ出力をリダイレクトしてファイルに保存してみよう
若木 しげる
以下をそのまま入力してみてね
cat > my-song << EOF
まいやひ
まいやふ
まいやほ
EOF
若木 みどり
わかったやってみるね!
若木 しげる
そうしたらmy-song中身を確認しよう
cat my-song
若木 みどり
どうなるんだろうね?
まいやひ
まいやふ
まいやほ
若木 みどり(驚き)
…すごい!my-song ファイルにヒアドキュメントの3行が保存されている!
若木 みどり(笑顔)
これ…エディタなしで簡単にテキストファイルが作れちゃんだね!
若木 しげる
ヒアドキュメントは手軽にテキストを扱いたい時に便利だよ
若木 みどり
> の代わりに >> として追記でもできるんだよね?
若木 しげる(笑顔)
もちろん!
ヒアストリング
若木 しげる
入力が1行の場合「ヒアストリング(here string)」を使うと便利なんだ書き方はこうだよ
コマンド <<< 文字列
若木 みどり
1行入力に特化したヒアドキュメントという感じだね「終了を表す文字列」の指定もいらないしこっちで書ける場合は記述が少なくて見やすいね!
まとめ
若木 みどり
今回はヒアドキュメントとヒアストリングの使い方を学んだよ!
若木 しげる
ヒアドキュメントやヒアストリングは簡単にコマンドの入力を生成できる便利な記述だよこれを覚えておけば操作の幅がもっと広がるよ!