エコー (コンピュータ)
エコーバック
編集CUIシェルやコマンドラインインタプリタなどキャラクタユーザインタフェースを入出力先とするコンソールアプリケーションでは、通常、コマンドなどのユーザからの入力が画面に表示されないと使い勝手が悪い。そのため、多くの場合はオペレーティングシステム (OS) の端末ドライバがそれを行うのであるが、キーボードなどからの入力を読むと、内部のバッファ等に書き込むだけでなく、ただちに出力として送り返す。これをエコーバック(英: echo back) という。
ネットワーク越しに遠くの(リモートの)コンピュータを使っている場合などは、上記のようにして返ってくるものを表示していたのでは、遅延により操作性が悪いことから、手元(ローカル)の端末の側でエコーバックさせる方式もある。これを「ローカルエコー」と呼び、それに対してリモートからのエコーを「リモートエコー」と呼ぶ。ローカルエコーありに設定した場合は、リモート側のエコーバックを生成する場所から手元の端末で表示するまでの間のどこかで、リモートエコーが抑止されるように設定されないと、文字が二重に表示される(読むのが辛く、事実上不可能かもということを除けば、表示の問題だけであり実害は無い)。
MS-DOSのCOMMAND.COMの内部コマンドの、ECHOコマンド(後述)において、引数がONまたはOFFという文字列の場合にオンまたはオフに制御されているのは、このエコーバックに関するモード(のようなもの)である[注 1]。
また、UnixではCUI画面からのログイン時のパスワード入力時には、入力に対して何の反応も表示されないが[注 2]、これは端末のエコーバックを無しにすることで抑制されている。コマンドで制御する場合は stty コマンドを使う。引数 echo
と -echo
(先頭のマイナスの有り無し)で指定する。stty echo
でエコーバック有り、stty -echo
でエコーバック無しになる。端末などを、いわゆるテキストユーザインタフェースで使う場合などもエコーバックが無しにされる。
echoコマンド
編集Unixなどのシステムにあるechoコマンドは、入力として引数で与えられた文字列を、そのまま出力するコマンドである。必ずしもシェルの内部コマンドとして実装しなければならないわけではないので外部コマンドであることもあるが、何らかの理由であらゆる外部コマンドが使えないなどの非常時のことなどもあり[注 3]、(外部コマンド版もあるが)内部コマンドであることが多い。MS-DOSのCOMMAND.COM(およびWindows NT系でそれを引き継いだcmd.exeの内部コマンドのECHOについては別に後述する。なお、正規UNIXおよび、その系統にあるUnix系のechoコマンドについて、癖のある問題があるのでここで特に記す(なおさらに、内部コマンド(シェルに依存)か、外部コマンド(シェルは無関係)か、という違いもあるので注意)。
標準であるPOSIXではechoコマンドに関して、オプションによる標準的な動作は何も規定されていない(正確には -n があった場合は implementation-defined である、といった規定がある)[1]。これは、ごく初期には以下で示すサンプルのような、全く何のオプションも認識しないバージョンもあったことと、標準化が始められた時点で既に混乱の収拾が不可能であったことが反映している(どんなオプションにも対応していないようなechoプログラムにオプションを与えたとすると、そのままそのオプションを入力とみなして、出力されてしまう。そのような期待されない動作を全て未然に防ぐには、標準としては何も規定しない、とする他ない)。Unixにおいて、コマンド引数の解釈にメタ的な標準が無いことが遠因であって、よくあるUnixへの苦情の原因の典型ではある(『The Unix-Haters Handbook』など)。
システムによるが、-n オプションを認識する場合は、最後に行終端子(改行)を追加しない。-e オプションを認識する場合は、\b などのエスケープシーケンスを解釈する(GNU coreutils版(GNU/Linuxでの外部コマンドのechoは専らこれ)のマニュアル[2]を参照)。BSDなど -e は認識しないものも多い。GNU AutotoolsのAutoconfのマニュアルの、「Portable Shell」 > 「Limitations of Shell Builtins」の中にあるechoに関する記述[3]も参照のこと。
問題の回避策としては、「コマンドは実行するが全く何も(空文字列すらも)出力しない[注 4]」という動作以外は、printfコマンド(POSIXの記述を参照のこと。なお、printfの記事はコマンドのほうのprintfの説明ではない)を代替として使うことで解決できる。
C言語で echo プログラムを書くと、次のようになる。
#include <stdio.h>
/* echo command-line arguments; 1st version */
main(int argc, char *argv[])
{
int i;
for (i = 1; i < argc; i++)
printf("%s%s", argv[i], (i < argc-1) ? " " : "");
printf("\n");
return 0;
}
MS-DOS
編集MS-DOSのCOMMAND.COM(およびそれを引き継いだcmd.exe)の内部コマンドのECHOコマンドは、上記のUnixのechoコマンドと同様の動作の他、COMMAND.COMからの出力のオンオフを制御する機能も持つ。具体的には、与えられた文字列が on または off だった場合は、それをエコーするのではなくオプションと解釈して(つまり、そのような文字列をエコーすることはできない)、COMMAND.COMからの出力をオンまたはオフする。バッチファイルの先頭に ECHO OFF
などと入れて、バッチファイル中のコマンドが表示されるのを抑止したりするのに使う(MS-DOSバージョン5以降では、コマンドの先頭に @ を付けるとその行の表示を抑止できるので、@ECHO OFF
として自身の表示も抑止することが多い)。また、引数無しで単に ECHO
コマンドだけを実行した場合(変数の内容が空だったりして、意図せずにそうなることはしばしばある)「ECHO は <ON> です。」(あるいは、<OFF> です。)と出力される(英語モードでは ECHO is on.
などと出力される)。
PHP
編集PHPにはechoという言語構造(language construct)[4]がある。同じく言語構造のprint[5]と似たようなものだが、引数を複数個付けられる点、値を返さない(voidである)点、などが異なる。
ping
編集ECHO
編集RFC 862 で定義されているECHOプロトコル。TCPポート7番で動作する。TCP接続を通して送られてきた文字列をそのまま返す。pingではネットワークが機能していることが確認できるだけであるため、OSの健在を確認するためなどに実用的に利用されているが、近年では可能な限りポートは閉めておくという方針が一般的であるため、開いていないことも多い。
脚注
編集注釈
編集- ^ やかましいことを言うと、本来は「入力のエコー」ではない、
C>
やC:\>
のような促進記号(プロンプト)の部分も一緒に出力されなくなる。このような不自然さに馴らされたMS-DOSユーザ的には、後述するPHPが、単なる出力の意味でechoという名前を使っているのも自然だと思われるのであろう。 - ^ ウェブブラウザの入力フォームでtype属性にpasswordが指定されている場合や、MS-DOSなどでは多かった * や _ などによる伏字による反応も無い理由は、昔のUnixでは、たとえば学校などで「端末室」と呼ばれるような、関係者であれば自由に出入りできる場所にあることも多く、パスワードは脇から覗き見られた場合などに文字数だけでもヒントになるために、一切表示されないのである。
- ^ たとえば、Unixではワイルドカードの展開がシェルで行われるので(MS-DOSは異なる)、lsコマンドが使えなくても
echo *
が非常時などでは代用になる。 - ^ 「空文字列を出力する」ことはできる(長さに 0 を指定して write システムコールを実行する)
出典
編集- ^ http://pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html
- ^ https://www.gnu.org/software/coreutils/manual/html_node/echo-invocation.html
- ^ https://www.gnu.org/savannah-checkouts/gnu/autoconf/manual/autoconf-2.69/html_node/Limitations-of-Builtins.html#echo
- ^ http://php.net/manual/en/function.echo.php
- ^ http://php.net/manual/en/function.print.php
外部リンク
編集- UNIX コマンドのマニュアル
- Manpage of echo GNU 版。JMプロジェクト
- echo(1) man page(SunOS リファレンスマニュアル)
- echo(1) man page(HP-UX リファレンス)