連載
» 2017年12月22日 05時00分 公開

Linux基本コマンドTips(170):【 eval 】コマンド――文字列を評価、連結して実行する

本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、文字列を評価、連結して実行する「eval」コマンドです。

[西村めぐみ,@IT]
「Linux基本コマンドTips」のインデックス

Linux基本コマンドTips一覧

 本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、文字列を評価、連結して実行する「eval」コマンドです。

evalコマンドとは?

 「eval」コマンドは、指定した文字列を評価後に連結して、現在のシェルに実行させます。主にシェルスクリプトや環境設定用のファイルで使用します ※1。

※1 evalコマンドの名前は、evaluate(評価する)に由来する。文字列を評価(展開)した後に実行するからだ。evalはシェルに組み込まれたビルトインコマンド。





evalコマンドの書式

eval [文字列 ……]

※[ ]は省略可能な引数を示しています。




evalの主なオプション

 evalコマンドにはオプションがありません。



コマンド文字列を生成して実行する

 「eval 文字列」で文字列をコマンドとして実行します。「eval 文字列1 文字列2 ……」のように文字列を複数指定した場合、スペースをはさんで連結後、シェルに実行させます。

 例えば「eval echo hello」であれば、現在のシェルで「echo hello」を実行します。複数のコマンドを続けて実行したい場合は「;」で区切ります。

 evalコマンドが威力を発揮する場面は2つあります。1つはあるコマンドが出力した文字列自体をコマンドとして実行すること、もう1つは(入れ子になった)変数を評価することです。

 あるコマンドが出力した文字列をコマンドとして実行する例を紹介します。例えば「dircolors」コマンドは、設定ファイルを読み込んで、環境変数LS_COLORSを設定するための文字列(コマンド)を出力します ※2。

 「eval `dircolors -b /etc/DIR_COLORS`」のように実行することで、(1)dircolorsコマンドが/etc/DIR_COLORSを読み出して、環境変数LS_COLORSを設定するための文字列を生成し、(2)その文字列をコマンドとして実行できます(画面1)※3。

※2 LS_COLORSはlsコマンドで表示する色を設定する環境変数。詳しくは連載第27回を参照。
※3 dircolorsの-bオプションはbash用という意味。Ubuntuでは、/etc/DIR_COLORSが存在せず、デフォルトでは環境変数LS_COLORSに設定が保存されている。



コマンド実行例

eval 文字列

(文字列をコマンドとしてシェルに実行させる)

eval `dircolors -b /etc/DIR_COLORS`

(「dircolors -b /etc/DIR_COLORS」の実行結果を現在のシェルで実行する)(画面1


画面1 画面1 dircolorsコマンドが出力した文字列をコマンドとして実行したところ

変数の内容をコマンドとして実行する

 画面2は変数を評価した例です。「echo $PS1」(プロンプトの表示形式を持つシェル変数PS1の表示)と「ps --forest」(プロセスの階層表示)を実行しています ※4。

※4 psコマンドの結果から、現在のシェルで文字列部分を実行していることが分かる(連載第169回を参照)。



画面2 画面2 変数を評価したところ 「;」で複数のコマンドを区切っている

 なお、evalの実行時点で$PS1の部分を展開しないようにするため、「echo '$PS1'」のようにシングルクオーテーションで変数をくくるか、「echo \$PS1」のように「$」の直前にバックスラッシュを付けてエスケープする必要があります。

 さらに「eval $変数名」で、変数の内容をコマンドとして実行できます(画面3)。

コマンド実行例

eval $変数名

(変数の内容をコマンドとしてシェルに実行させる)

eval $SHELL --version

(「/bin/bash --version」を実行。/bin/bashは変数SHELLの内容)(画面3


画面3 画面3 変数$SHELLの内容をコマンドとして実行したところ

入れ子になった変数の内容を展開する

 「eval '$'$変数名」で、「変数の内容」を変数名として参照できます。シングルクオーテーションの位置に注意してください。

 例えば変数ver1に文字列seagullをセットし、変数targetに文字列ver1をセットしたとしましょう。

 「eval echo '$'$target」で「echo $ver1」を実行できます(画面4)。また、「eval ls '$'$target」では「ls seagull」を実行します。

画面4 画面4 入れ子になった変数を展開して実行したところ


筆者紹介

西村 めぐみ(にしむら めぐみ)

PC-9801NからのDOSユーザー。PC-486DX時代にDOS版UNIX-like toolsを経てLinuxへ。1992年より生産管理のパッケージソフトウェアの開発およびサポート業務を担当。著書に『図解でわかるLinux』『らぶらぶLinuxシリーズ』『Accessではじめるデータベース超入門[改訂2版]』『macOSコマンド入門』など。2011年より、地方自治体の在宅就業支援事業にてPC基礎およびMicrosoft Office関連の教材作成およびeラーニング指導を担当。


Copyright© 2018 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。