harry’s memorandum

おれおれメモ

知らなかった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コマンドは便利ですよ。