以下の文書はBashを使う前提の話。
Bashにはコマンド置換(Command substitution)というのがある。$(another-command)
のように、$()
でコマンドを括る記法だ。これを利用すると、括弧で括られたコマンドが実行され、その標準出力が文字列として取り出され、$()
全体を置き換える。シェルスクリプトでは非常によく見る技術だ。
この$()
でファイルの内容を読み出すというのを最近見た。このような用法は非常によく見る。
foo-command $(cat params.txt)
しかし、より良い書き方があるのでこれを提唱したい。$(< params.txt)
と書くことで全く同等のことができる。しかも速いのでこちらのほうが完全に上位互換となる。
foo-command $(< params.txt)
この方法はBashのドキュメントのコマンド置換のコーナーにちゃんと書かれていて、「ファイルを読み出したいだけならcat
じゃなくてこっち使ったほうが速いよ」とある。
The command substitution $(cat file) can be replaced by the equivalent but faster $(< file). Command Substitution (Bash Reference Manual)
使うかどうかは人次第だけれど、マニュアルにちゃんと書かれた良い方法であり、デメリットは一切ないので、普通にこれを書くことをおすすめします。
補足
ソフトウェアエンジニアをやっていてBashを書かない日はない。特にバッチとかちょっとしたスクリプトを書くときにBashは欠かせない。Bashでしか動かない機能を/bin/sh
で利用する――――いわゆるBashism――――は好きではないのだが、ある程度複雑なシェルスクリプトでは/bin/bash
としてBashを最初から利用するのはよくあることだと思う。そういう前提の話なので、Bashでしか使えないのは良くない、みたいな話ではないです。簡単なスクリプトはPOSIX sh準拠で書けばいいし、そうでなければ明示してBashでいいと思います。