- LinuxおよびmacOSの「yes」コマンドは、「yes」または「no」文字列など、任意のメッセージを繰り返し生成できます。
- 「yes」コマンドからの出力を他のプログラムまたはスクリプトにパイプして、自動応答を提供できます。
- 「yes」コマンドは、出力をファイルにリダイレクトすることで、大きなファイルをすばやく生成するためにも使用できます。
yesコマンドは実用的な用途には単純すぎるように思えますが、このチュートリアルでは、そのアプリケーションと、LinuxとmacOSでその抑圧された肯定性を活用する方法を紹介します。
yesコマンドは何をしますか?
コマンドラインパラメータなしで使用すると、yesコマンドは「y」と入力してEnterキーを繰り返し(繰り返し、繰り返し)押しているかのように動作します。非常に高速です。そして、Ctrl+Cを押して中断するまで、そうし続けます。
yes
実際、yesは任意のメッセージを繰り返し生成するために使用できます。yesとスペースを入力し、使用する文字列を入力して、Enterキーを押すだけです。これは、yesで「yes」または「no」文字列の出力ストリームを生成するために使用されることがよくあります。
yes yes
yes anything you like
しかし、それは何の役に立ちますか?
yesからの出力を他のプログラムまたはスクリプトにパイプできます。
これは聞き覚えがありますか?長いプロセスを開始して離れ、実行させます。コンピュータに戻ると、プロセスはまったく完了していません。不在の間、質問され、「はい」または「いいえ」の応答を待っています。
すべての回答が肯定的(「はい」または「y」)または否定(「いいえ」または「n」)であることが事前にわかっている場合は、yesを使用してそれらの応答を提供できます。その場合、長いプロセスは、プロセスが質問するすべての質問に対する回答をyesが提供し、無人ですべて完了します。
スクリプトでyesを使用する
次のBashシェルスクリプトを見てください。(これは、実行にかなりの時間がかかるはるかに大きなスクリプトの一部であると想像する必要があります。)
<code>#!/bin/bash # ... # 長いスクリプトの途中 # ユーザーから応答を取得する # ... echo "続行してもよろしいですか? [y,n]" read input # 入力値を取得しましたか? if [ "$input" == "" ]; then echo "ユーザーから何も入力されませんでした" # yまたはyesでしたか? elif [[ "$input" == "y" ]] || [[ "$input" == "yes" ]]; then echo "肯定的な応答: $input" # それ以外はすべて否定的な応答として扱います else echo "否定的な応答: $input" fi
このスクリプトは質問をして、応答を待ちます。スクリプト内のロジックフローは、ユーザーからの入力によって決定されます。
- 「はい」または「y」は肯定的な応答を示します。
- その他の入力はすべて否定的な応答とみなされます。
- 入力テキストなしでEnterキーを押しても何も起こりません。
これをテストするには、スクリプトをファイルにコピーして「long_script.sh」として保存します。chmodを使用して実行可能にします。
chmod +x long_script.sh
次のコマンドでスクリプトを実行します。「はい」、「y」、およびその他の入力を試してみて、入力テキストなしでEnterキーを押します。
./long_script.sh
yesがスクリプトの質問に対する応答を提供するようにするには、yesからの出力をスクリプトにパイプします。
yes | ./long_script.sh
一部のスクリプトは、要件が厳しく、「yes」という単語全体のみを肯定的な応答として受け入れます。次のように、yesに「yes」をパラメータとして提供できます。
yes yes | ./long_script.sh
考えずにyesと言わないでください
スクリプトまたはプログラムにフィードする入力が、確実に期待する結果をもたらすことを確認する必要があります。その決定を下すためには、質問とその応答内容を知る必要があります。
スクリプト、コマンド、またはプログラムのロジックは、期待と一致しない場合があります。この例のスクリプトでは、質問は「停止しますか?[y、n]」だった可能性があります。その場合、否定的な応答により、スクリプトが続行できたでしょう。
yes
を軽率にパイプする前に、スクリプト、コマンド、またはプログラムに精通している必要があります。
コマンドでyesを使用する
初期の頃は、yes
は他のLinuxコマンドと一緒に使用されていました。それ以来、それらの他のLinuxコマンドのほとんどは、人間との対話なしで実行する方法を独自に持っています。それを達成するためにyes
はもはや必要ありません。
例として、Ubuntuパッケージマネージャーapt-get
を取り上げましょう。インストールの途中で「y」を押すことなくアプリケーションをインストールするには、yes
を次のように使用します。
yes | sudo apt-get install fortune-mod
apt-get
の-y
(yesとみなす)オプションを使用すると、同じ結果を得ることができます。
sudo apt-get -y install fortune-mod
apt-get
は通常の「続行しますか?[Y/n]」という質問さえしませんでした。答えが「はい」であると想定しただけです。
他のLinuxディストリビューションでは、状況は同じです。Fedoraでは、一度はこのタイプのパッケージマネージャーコマンドを使用していたでしょう。
yes | yum install fortune-mod
dnf
パッケージマネージャーはyum
に取って代わり、dnf
には独自の-y
(yesとみなす)オプションがあります。
dnf -y install fortune-mod
同じことがcp
、fsck
、およびrm
にも当てはまります。これらのコマンドにはそれぞれ独自の-f
(強制)または-y
(yesとみなす)オプションがあります。
では、yes
はスクリプトでのみ動作するように格下げされたように見えますか?そうではありません。老犬にはまだちょっとしたコツがあります。
さらにyesのコツ
seq
で生成された数字のシーケンスを使用してyes
を使用し、繰り返しアクションのループを制御できます。
このワンライナーは、生成された数字をターミナルウィンドウにエコーし、1秒間sleep
を呼び出します。
単に数字をターミナルウィンドウにエコーするのではなく、別のコマンドまたはスクリプトを呼び出すことができます。そのコマンドまたはスクリプトは数字を使用する必要はなく、ループの各サイクルを開始するためだけに存在します。
yes "$(seq 1 20)" | while read digit; do echo digit; sleep 1; done
テスト用に大きなファイルを用意すると便利な場合があります。zipコマンドの使い方を練習したい場合や、FTPアップロードをテストするためのかなりのサイズのファイルが必要な場合があります。
yes
を使用して、大きなファイルをすばやく生成できます。必要なことは、作業する長いテキスト文字列を提供し、出力をファイルにリダイレクトすることだけです。間違いありません。それらのファイルは急速に成長します。数秒以内にCtrl + Cを押す準備をしてください。
yes long line of meaningless text for file padding > test.txt
ls -lh test.txt
wc test.txt
この記事の調査に使用されたテストマシンでは、ここで生成されたファイルは約5秒かかりました。ls
はそれが557 Mbのサイズであると報告し、wc
はそこに1240万行あると教えてくれます。
コマンド文字列にhead
を含めることで、ファイルのサイズを制限できます。ファイルに含める行数を指定します。-50
はhead
が50行だけtest.txt
ファイルに渡すことを意味します。
yes long line of meaningless text for file padding | head -50 > test.txt
test.txt
ファイルに50行あるとすぐに、プロセスは停止します。Ctrl + Cを使用する必要はありません。それ自体で優雅に停止します。
wc
は、ファイルに50行、400語、サイズが2350バイトであることを報告しています。
yesコマンドは、LinuxやmacOSなどの他のUnix系オペレーティングシステムで最も単純なコマンドの1つです。Ken Thompsonによって作成され、System 7 Unixでリリースされたオリジナルバージョンのソースコードは、わずか6行のコードです。長時間のスクリプト(およびその他のいくつかのトリック)に応答を入力するために依然として役立ちますが、yes
コマンドは日常的に使用するコマンドのツールキットの一部にはなりません。しかし、必要な場合は、それが単純さそのものであることがわかります。そして、すべて6行の黄金のコードです。
コメントする