Lambdaカクテル

京都在住Webエンジニアの日記です

Invite link for Scalaわいわいランド

Bashで$(cat foo.txt)していませんか?$(< foo.txt)しよう

以下の文書は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でいいと思います。

★記事をRTしてもらえると喜びます
Webアプリケーション開発関連の記事を投稿しています.読者になってみませんか?