知らなかったyesコマンドの真の力
yesコマンドとは?
'YES' - 妖精がみえてしまうジョンアンダーソンのプログレッシブバンドのことではありません。UNIX/Linux の yes コマンドを少しだけ語ってみたいと思います。
yesコマンドってなんですか?という人はまずUNIX/Linuxのターミナルで'yes'と入力してみましょう。
$ yes y y y^C
y がひたすら続きます。引数に文字列を渡せばその文字列をひたすら吐き出します。
$ yes "Cirque du Soleil" Cirque du Soleil Cirque du Soleil Cirque du Soleil Cirque du Soleil^C
これ意味あんの?と思いたくなります。では何に使えるのでしょう? そうターミナルで対話的に行うときに なんと あの y を入力してくれるのです。
yesの例
まずテストファイル作成
$ for i in foo hoge bar huga; do touch ${i}.txt; done $ ls *.txt bar.txt foo.txt hoge.txt huga.txt
rm -i なので対話的になります。
$ rm -i *.txt rm: 通常の空ファイル `bar.txt'を削除しますか? ^C
yes を使うと 'y'で全部消してくれる!!
$ yes | rm -i *.txt rm: 通常の空ファイル `bar.txt'を削除しますか? rm: 通常の空ファイル `foo.txt'を削除しますか? rm: 通常の空ファイル `hoge.txt'を削除しますか? rm: 通常の空ファイル `huga.txt'を削除しますか?
なんて男らしいコマンドだ。え? 「\rm -f でいいんじゃね」、「せっかくの "prompt before every removal" の意味がない」と言われそうですけど気にしないでください。私は以下みたいな使い方しています。
ユーザの一括作成コマンド
ランダムに生成したパスワードを passwdコマンドで対話的に変更するところを、 yesコマンドで自動的に入力します。
#!/bin/bash gen_password() { dd if=/dev/urandom count=2000 bs=1 2>/dev/null|\ LC_ALL=C tr -d -c '[:alnum:]' | cut -b -20 } for u in cartman stan kenny kyle do id $u > /dev/null 2>&1; stat=$? [ $stat -eq 0 ] && continue useradd -s /bin/bash -d /home/$u $u > /dev/null password=`gen_password` yes $password | passwd $u > /dev/null 2>&1 echo "$password - $u" done
こんな感じでユーザを一括で作成。
$ sudo bash gen_users.sh PoWjCBIea5IYCRVgVGIc - cartman DfLxpH9WuLfesCY9VD3V - stan U2Lsz82TuZK57vo7tcOL - kenny FjDOSQPavo2YAuENztd9 - kyle
いやー 本当にyesコマンドは便利ですよ。