tweeeetyのぶろぐ的めも

アウトプットが少なかったダメな自分をアウトプット<br>\(^o^)/

スクリプトやコマンドの実行結果をコマンドとして実行するメモ(バッククオート``や$( )を使おう)

はじめに

コマンドの実行結果やらスクリプトの実行結果が コマンド文字列を生成してくれるやつとかって用意されてたり作ったりしますよね?(しないかもですがw)

例えばこんな

# make_command.pl -u hoge -p /home/hoge/sample
chwon -R hoge:hoge /home/hoge/sample

結果がこんなコマンドなら自分で打てばいいわけですが、
結果がめっちゃなげーやつとかmake_command.plの中でわざわざDBやら設定ファイルやらから値をひっぱってきて作ってくれたり。

そんな時に出力してくれたchwon -R hoge:hoge /home/hoge/sampleを コピペしてもいいんですがどうせならそのまま実行したいじゃないですか。

そんなときのメモ。

やりかた

やりかたは簡単で下記のどちらかで実現できます

  • ``バッククオートで囲む
  • $()で囲む

ためす

dateコマンドは現在日時を表示してくれますが、
今回はコマンドの実行結果やスクリプトの結果がdateという文字列であるやつを用意してためしてみます

また試したのはmacのターミナルですがlinuxなどのcentosでもいけるでしょう

dateコマンドの動作

dateコマンドを叩いた結果を確認します。
結果として文字列dateに対して何かしたらこれと同じ表示になればいいですよね

# date
2015年 1月 8日 木曜日 21時38分24秒 JST
echoでやってみる
※ 普通にecho dateとすると`date`という文字列として表示される
# echo date
date

※ バッククオートで囲む
# `echo date`
2015年 1月 8日 木曜日 21時40分47秒 JST

※ $()で囲む
# $(echo date)
2015年 1月 8日 木曜日 21時40分50秒 JST

みごとできました。

シェルスクリプトの結果がdateと表示されるヤツで試す

これが本題な感じですね。
何か実行した結果をコマンドとして実行。

※ 中身はechoしてるだけのshを用意
# vi date.sh
---- vi追記 ----
echo date
---------------

※ 普通に実行
# ./date.sh
date

※ バッククオートで囲む
# `./date.sh`
2015年 1月 8日 木曜日 21時45分33秒 JST

これで今回やりたかったことは終わりなのですが、
さらに少し遊んでみます\(^o^)/

まさかのdateというファイル名をlsした結果でコマンドを実行してみる

もはやお遊びです

# touch date

# ls -l
-rw-r--r--  1 hoge  hoge   0  1  8 15:47 date
-rwxr-xr-x  1 hoge  hoge  10  1  8 21:44 date.sh

# ls date
date

# `ls date`
2015年 1月 8日 木曜日 21時48分25秒 JST
複数行表示される結果をコマンドとして実行してみる

これは意外に苦戦しました。
あえて失敗したバカな自分のやつも晒しておきます

失敗例
※ 3行書いておく
# vi dates.sh
---- vi追記 ----
echo date
echo date
echo date
---------------

※ 当たり前だけど3行表示される
# ./dates.sh
date
date
date

※ バッククオートで囲む
# `./dates.sh`
date: illegal time format
usage: date [-jnu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ... 
            [-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format]

これはdateコマンドをこんな感じで打ったときと同じことになります

# date
2015年 1月 8日 木曜日 21時53分52秒 JST

# date date
date: illegal time format
usage: date [-jnu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ... 
            [-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format]

まぁ当然ですね。。。。orz  
 
コマンドライン上でdateコマンドを複数打ちたい場合は
date; date;とやればうまくいくので、
勘が悪い自分はshの中身の一行をecho 'date;'とかにしてみましたがダメでした。。。orz
※ ファイルの中身が1行の場合はイケます

成功例

結局shの中身を工夫するやりかたはうまいこと浮かびませんでしたが
forをつかって強引に成功パターンとしましたw

※ 3行書いておく
# vi dates.sh
---- vi追記 ----
echo date
echo date
echo date
---------------

※ 当たり前だけど3行表示される
# ./dates.sh
date
date
date

※ forのワンライナーでやる
# for v in `./dates.sh`; do `echo $v`; done
2015年 1月 8日 木曜日 22時08分21秒 JST
2015年 1月 8日 木曜日 22時08分21秒 JST
2015年 1月 8日 木曜日 22時08分21秒 JST

まとめ

最初はバッククオートで囲めばできるよっていう短いメモで終わらせるつもりが
ついつい遊んでしまいました(><)

$()についてはネストするときは便利なんかのこんな記事もあるのでご参考に
bashの $( )