yes コマンド入門 - 対話プロンプトを自動応答する

yes コマンド入門 - 対話プロンプトを自動応答する

この記事でわかること

  • yes コマンド が何をするコマンドなのか分かる
  • 「本当に削除しますか? (y/n)」のような 対話プロンプトに自動で答える 方法が分かる
  • yes コマンドが なぜ危険になりうるか と、その回避方法が分かる
  • -y オプションなど、yes より 安全な代替手段 が分かる

結論(先に覚えるべき型)

  • とりあえず全部 y で答えたい → yes | コマンド
  • でも基本は コマンド自身の -y オプション を使うほうが安全
  • yes を止めるには Ctrl + C

1. yes コマンドって何?

結論: yes は y という 1 文字を、止めるまで無限に出力し続けるだけのコマンド。

リナ: 先輩、yes っていう名前のコマンドがあるって聞いたんですけど、何をするんですか? 「はい」って答えるコマンド?
ライニー先輩: いい質問。yes は名前のとおりだけど、もっと単純だよ。y という文字を、止めるまでひたすら出力し続けるだけ のコマンドなんだ。
リナ: ひたすら? 試しに打ってみますね。
ライニー先輩: ちょっと待った。そのまま打つと画面が y で埋め尽くされて止まらなくなるよ。止め方を先に教えるね。Ctrl + C を押せば止まる。それを覚えてから試してみて。

実際に打つとこうなる(すぐ Ctrl + C で止めること)。

$ yes
y
y
y
y
(Ctrl + C で止めるまで延々と続く)

yes を引数なしで打つと 無限に y が出力され続ける。慌てず Ctrl + C を押して止めること。これは故障ではなく、yes の正常な動作。

2. なぜ「無限に y を出す」コマンドが役に立つの?

結論: 「本当に実行しますか? (y/n)」と何度も聞いてくるコマンドに、その y を自動で流し込むため。

リナ: でも、y を無限に出すなんて、何の役に立つんですか?
ライニー先輩: 単体だとただのいたずらみたいだよね。真価は パイプ(|)と組み合わせたとき に出るんだ。
リナ: パイプ……前にやった「左の出力を右に渡す」やつですね。
ライニー先輩: そう。たとえばファイルをたくさん消すとき、rm が 1 個ずつ「本当に消す? (y/n)」と聞いてくることがある。100 個あったら 100 回 y を打つことになる。そこで yes の出番。

yes が活躍する場面

「本当に実行しますか? (y/n)」のような 確認プロンプトを何度も出すコマンド に対して、その y を自動で供給する。これで人間が何度も y を打つ手間が省ける。

3. パイプで自動応答する:yes | コマンド

結論: yes | コマンド で、コマンドが出す確認プロンプトすべてに自動で y が渡される。

たとえば、-i(確認あり)オプション付きの rm は、削除のたびに確認してくる。

$ rm -i file1.txt file2.txt file3.txt
rm: remove regular file 'file1.txt'?

ここで毎回 y を打つ代わりに、yes をパイプでつなぐと、すべての確認に自動で y が渡される。

$ yes | rm -i file1.txt file2.txt file3.txt
リナ: yes | を頭に付けただけで、全部の確認に答えてくれるんですね!
ライニー先輩: そういうこと。yes が y を流し続けて、rm がそれを 1 個ずつ受け取って消していく。確認の回数がいくつでも対応できるよ。

これは便利だが 同時にとても危険。確認をすべて飛ばすということは、間違ったファイルも問答無用で消える ということ。実行前にコマンドの対象を必ず確認すること。詳しくは後の「yes の危険性」で扱う。

4. 任意の文字列を繰り返す:yes STRING

結論: yes に引数を付けると、y の代わりにその文字列を繰り返し出力する。

yesy 専用ではない。引数を渡すと、その文字列を繰り返す。

$ yes hello
hello
hello
hello
(Ctrl + C まで続く)

複数の単語を渡すと、スペースでつないで 1 行にする。

$ yes I am ready
I am ready
I am ready
(Ctrl + C まで続く)

空文字を繰り返す(Enter 連打の代わり)

yes "" とすると、空の行(改行だけ)を繰り返す。「ただ Enter を押し続ける」だけでよいプロンプトに使える。

$ yes "" | コマンド

結論: yeshead とつなぐと、無限ではなく決まった行数だけ取り出せる。テストデータ作りに便利。

無限なのが困る場合は、head で必要な行数だけ取り出す。

$ yes | head -n 5
y
y
y
y
y

任意の文字列でも同じ。同じ行を 3 つ並べたテキストが一瞬で作れる。

$ yes test | head -n 3
test
test
test
リナ: 無限ループを head で「ここまで」と切るんですね。
ライニー先輩: そう。yes はコマンドの動作確認やテスト用のダミーデータを作るときにも地味に役立つんだ。head -n 回数 で好きな行数に区切れる。

6. yes の危険性

結論: yes は確認を全部スキップするため、削除や上書きなど取り返しのつかない操作と組み合わせると事故になる。

リナ: yes | って万能じゃないですか。全部これで済ませちゃダメなんですか?
ライニー先輩: そこが一番大事なところ。確認プロンプトは 「本当に大丈夫? 取り返しつかないよ?」という最後の安全装置 なんだ。yes はそれを全部無視する。だから消してはいけないファイルまで巻き込むと、もう戻せない。

自分が何を実行しようとしているか分からないコマンドに yes | を付けない。ネット上のコマンドをコピペするとき、頭に yes | が付いていたら特に警戒すること。

7. yes より安全な代替手段

結論: 多くのコマンドは自前の -y / --yes オプションを持つ。yes パイプよりこちらを優先する。

実は、確認を省きたいだけなら yes を使わずに済むことが多い。コマンド自身が 「はい」を指定するオプション を持っているからだ。

コマンド自身の確認スキップオプション(一例)

コマンド 確認をスキップするオプション
apt -y / --yes
dnf / yum -y
cp / mv -f(強制)
rm -f(確認を出さない)

例: sudo apt install -y パッケージ名

リナ: なるほど、apt install -y-y って、まさに「はい」なんですね!
ライニー先輩: そのとおり。コマンド専用のオプションは「このコマンドのこの確認だけ」を狙って消せる。一方 yes は すべての確認を無差別に潰す。だから、専用オプションがあるならそっちを使うのが安全なんだ。

使い分けの目安

  • 専用の -y / -f オプションがある → そちらを使う(安全・意図が明確)
  • 専用オプションがない、または何度も繰り返し聞かれる → yes | を検討(対象を確認したうえで)

8. ミニ課題:実際にやってみよう

結論: yes の出力、回数の区切り、任意文字列の 3 問で基本を手で確かめる。Ctrl + C を忘れずに。

リナ: 手を動かして覚えたいです!
ライニー先輩: いいね。どれも Ctrl + C で止められるから、安心して試してみて。

課題1: yes を引数なしで実行して、y が出力されることを確認し、Ctrl + C で止めてみよう。

ヒントを見る

yes と打って Enter。画面が y で埋まったら Ctrl + C を押す。

解答例
$ yes

止めるには Ctrl + C

課題2: OK という文字列を、ちょうど 4 行だけ出力しよう。

ヒントを見る

yes 文字列head -n 行数 をパイプでつなぐ。

解答例
$ yes OK | head -n 4

課題3: apt でパッケージをインストールするとき、確認を省く方法を、yes コマンドを使わずに書いてみよう。

ヒントを見る

コマンド自身の -y オプションを使う。

解答例
$ sudo apt install -y パッケージ名

9. コピペ用テンプレート

結論: 自動応答・回数区切り・空行・安全な代替の型をまとめて手元に置いておく。

よく使う型をまとめておく

# 確認プロンプトに自動で y を答える(対象を確認してから)
yes | コマンド

# 同じ行を決まった回数だけ出力(テストデータ作成)
yes | head -n 5
yes test | head -n 3

# 空行(Enter)を繰り返す
yes "" | コマンド

# 【推奨】専用オプションで確認をスキップ
sudo apt install -y パッケージ名

# yes を止める
Ctrl + C

次に読む