こんにちは!
江嵜です!
今回は、知っているといつか役立つかもしれない、コマンドの 「y」 自動入力の小ネタについてお話いたします。
自動化させたいときに「y」を入力させるコマンドが邪魔すぎる!
最近、環境構築は Ansible や Docker の登場等々で自動化の一途をたどっていますよね。
自動化素晴らしい!のですが、すべてのコマンドを自動で実行させようとしたときに現れる障害…
y
を入力させるやつですね!
ここで入力を待ってしまうので、自動化が出来ない…!となるわけです。
こちらの画像では yum update
なので、もちろん yum update -y
のように、自動で yes にしてくれるオプションがあるので良いですが…
誰かが作った Makefile 等、そういったオプションがない場合もありますよね。
y
を入力しなければならないコマンドは自動化できないのでしょうか…?
標準入力に 「y」 を渡せ!
いえ!そんなことはありません!
良く考えてみてください。
キーボードから y を入力するということは、言い換えれば「標準入力へ y を渡す」ということではないでしょうか。
(キーボードの入力は基本的に標準入力というところに入るんですよ!)
さて、 linux にはあるコマンドの標準出力(通常はディスプレイに表示される)を、次のコマンドの標準入力へ受け渡すワザがありましたよね?
そう、パイプ( | こんな縦棒のやつ)です!
単純に y を標準出力に出すには、 echo y
でいいですね。
つまり、 echo y | yum update
とすると…
途中で y を入力することなく進めることができましたね!
1 コマンドで y を何度も入力する必要がある場合は…? yes を使え!
とりあえずこれでめでたしめでたし…なのですが、さらにレアケースで y を何度も入力しなければならない場合はどうしましょうか?
echo で頑張ってもいいのですが、もっとスマートに解決する方法はないのか…
それに、再帰的にコマンドが実行される等、何度 y を入力する必要があるかも分からない場合もあるかもしれません。
そんなコマンドは自動化をあきらめるしかないのでしょうか…?
いえ、そんなことはありません!
yes
コマンドを使えばいいのです!
yes ってどんなコマンド?
ただただ、 y
を出力するだけのコマンドです。
完全に y 入力を自動化するためだけに生まれたコマンドですね!
man yes
でマニュアルを表示させると…
オプションは --help
と --version
だけ!
シンプル!
ちなみに、 yes hoge
のように、yes の後に任意の文字列を渡すと、 y
の代わりに指定の文字列を延々と出力します。
yes を使って自動化!
yes コマンドでもやりたいことは一緒なので、 yes | (y 入力を必要とするコマンド)
で、コマンドに対して必要なだけ y を渡せます!
例えば、 rm -i file*.tmp
として、大量に y を要求されるときでも…
( 普通に -i 外せば質問されないんですけどね)
yes を使えばこんな感じ!
一瞬で終わりましたね!
yes は自動化構築にとっても便利!
yes を使えばどれだけ y
を要求されても、必要なだけ入力してくれるので便利ですね!
ただ、ここまで yes 最高!みたいに書きましたが、コマンドには yum update -y
のように、自動で入力させたり、
rm -f hoge.txt
のように、強制的に実施させるオプションが用意されていることが多いです。
まずはきちんとオプションを確認して、用意されている機能の中で完結させるようにしたいですね!
yes みたいな力業ばかりに頼らないように、気を付けましょう。