はじめに
コマンドの実行結果やらスクリプトの実行結果が コマンド文字列を生成してくれるやつとかって用意されてたり作ったりしますよね?(しないかもですが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の $( )