エコー (コンピュータ)

コンピュータ分野におけるエコー（）は、引数として入力した文字列を出力するコマンドを指す。

 エコーバック 
CLIシェルやコマンドラインインタプリタなどキャラクタユーザインタフェースを入出力先とするコンソールアプリケーションでは、通常、コマンドなどのユーザからの入力が画面に表示されないと使い勝手が悪い。そのため、多くの場合はオペレーティングシステム (OS) の端末ドライバがそれを行うのであるが、キーボードなどからの入力を読むと、内部のバッファ等に書き込むだけでなく、ただちに出力として送り返す。これをエコーバック（） という。

ネットワーク越しに遠くの（リモートの）コンピュータを使っている場合などは、上記のようにして返ってくるものを表示していたのでは、遅延により操作性が悪いことから、手元（ローカル）の端末の側でエコーバックさせる方式もある。これを「ローカルエコー」と呼び、それに対してリモートからのエコーを「リモートエコー」と呼ぶ。ローカルエコーありに設定した場合は、リモート側のエコーバックを生成する場所から手元の端末で表示するまでの間のどこかで、リモートエコーが抑止されるように設定されないと、文字が二重に表示される（読むのが辛く、事実上不可能かもということを除けば、表示の問題だけであり実害は無い）。

DOSのCOMMAND.COMの内部コマンドの、ECHOコマンド（後述）において、引数がONまたはOFFという文字列の場合にオンまたはオフに制御されているのは、このエコーバックに関するモード（のようなもの）であるやかましいことを言うと、本来は「入力のエコー」ではない、 C> や C:\> のような促進記号（プロンプト）の部分も一緒に出力されなくなる。このような不自然さに馴らされたDOSユーザー的には、後述するPHPが、単なる出力の意味でechoという名前を使っているのも自然だと思われるのであろう。。

また、Unix系ではCLI画面からのログイン時のパスワード入力時には、入力に対して何の反応も表示されないがウェブブラウザの入力フォームでtype属性にpasswordが指定されている場合や、DOSなどでは多かった * や _ などによる伏字による反応も無い理由は、昔のUNIXでは、たとえば学校などで「端末室」と呼ばれるような、関係者であれば自由に出入りできる場所にあることも多く、パスワードは脇から覗き見られた場合などに文字数だけでもヒントになるために、一切表示されないのである。、これは端末のエコーバックを無しにすることで抑制されている。コマンドで制御する場合は stty コマンドを使う。引数 echo と -echo（先頭のマイナスの有り無し）で指定する。stty echo でエコーバック有り、stty -echo でエコーバック無しになる。端末などを、いわゆるテキストユーザインタフェースで使う場合などもエコーバックが無しにされる。

 sttyコマンドの標準: https://pubs.opengroup.org/onlinepubs/9699919799/utilities/stty.html

 echoコマンド 
Unix系などのシステムにあるechoコマンドは、入力として引数で与えられた文字列を、そのまま出力するコマンドである。必ずしもシェルの内部コマンドとして実装しなければならないわけではないので外部コマンドであることもあるが、何らかの理由であらゆる外部コマンドが使えないなどの非常時のことなどもありたとえば、Unix系ではワイルドカードの展開がシェルで行われるので（DOSは異なる）、lsコマンドが使えなくても echo * が非常時などでは代用になる。、（外部コマンド版もあるが）内部コマンドであることが多い。DOSのCOMMAND.COM（およびWindows NT系でそれを引き継いだcmd.exeの内部コマンドのECHOについては別に後述する。なお、正規UNIXおよび、その系統にあるUnix系のechoコマンドについて、癖のある問題があるのでここで特に記す（なおさらに、内部コマンド（シェルに依存）か、外部コマンド（シェルは無関係）か、という違いもあるので注意）。

標準であるPOSIXではechoコマンドに関して、オプションによる標準的な動作は何も規定されていない（正確には -n があった場合は implementation-defined である、といった規定がある）https://pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html。これは、ごく初期には以下で示すサンプルのような、全く何のオプションも認識しないバージョンもあったことと、標準化が始められた時点で既に混乱の収拾が不可能であったことが反映している（どんなオプションにも対応していないようなechoプログラムにオプションを与えたとすると、そのままそのオプションを入力とみなして、出力されてしまう。そのような期待されない動作を全て未然に防ぐには、標準としては何も規定しない、とする他ない）。Unix系において、コマンド引数の解釈にメタ的な標準が無いことが遠因であって、よくあるUnix系への苦情の原因の典型ではある（『The Unix-Haters Handbook』など）。

システムによるが、-n オプションを認識する場合は、最後に行終端子（改行）を追加しない。-e オプションを認識する場合は、\b などのエスケープシーケンスを解釈する（GNU coreutils版（GNU/Linuxでの外部コマンドのechoは専らこれ）のマニュアルhttps://www.gnu.org/software/coreutils/manual/html_node/echo-invocation.htmlを参照）。BSDなど -e は認識しないものも多い。GNU AutotoolsのAutoconfのマニュアルの、「Portable Shell」 > 「Limitations of Shell Builtins」の中にあるechoに関する記述https://www.gnu.org/savannah-checkouts/gnu/autoconf/manual/autoconf-2.69/html_node/Limitations-of-Builtins.html#echoも参照のこと。

問題の回避策としては、「コマンドは実行するが全く何も（空文字列すらも）出力しない「空文字列を出力する」ことはできる（長さに 0 を指定して write システムコールを実行する）」という動作以外は、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;
 }


 DOS 
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）http://php.net/manual/en/function.echo.phpがある。同じく言語構造のprinthttp://php.net/manual/en/function.print.phpと似たようなものだが、引数を複数個付けられる点、値を返さない（voidである）点、などが異なる。

 歴史 
echoは最初、Multicsで導入され、後にダグラス・マキルロイによりC言語で書き直され、その有用性が証明された後、Version 2 Unixの一部となった。Version 7 Unixにおけるecho -nは、それまでのprompt（echoと同様の動作をするが、出力の最後に改行を付けないコマンド）に置き換えられたhttp://www.cs.dartmouth.edu/~doug/reader.pdf。

PWB/UNIX及びUnix System IIIにおいて、echoはC言語のエスケープシーケンスの変換をするようになったhttp://www.in-ulm.de/~mascheck/various/echo+printf/。

Research Unixのechoは、-eオプションが渡されたときのみエスケープ変換を行う仕様だったhttp://man.cat-v.org/unix_8th/1/echo。この動作はBashやzshの組み込みechoコマンド、およびGNU版のechoなどに引き継がれている。

MS-DOSは、バージョン2からechoを搭載しているWolverton, Van (2003). Running MS-DOS Version 6.22 (20th Anniversary Edition), 6th Revised edition. Microsoft Press. ISBN 0-7356-1812-7。

 ping 
ping で使われるICMPパケットを echo と呼ぶ。 を参照。

 ECHO 

 で定義されているECHOプロトコル。TCPポート7番で動作する。TCP接続を通して送られてきた文字列をそのまま返す。pingではネットワークが機能していることが確認できるだけであるため、OSの健在を確認するためなどに実用的に利用されているが、近年では可能な限りポートは閉めておくという方針が一般的であるため、開いていないことも多い。

 脚注 

 注釈 

 出典 

 外部リンク 
 UNIXコマンドのマニュアル
 Manpage of echo GNU 版。JMプロジェクト
 echo(1) man page（SunOS リファレンスマニュアル）
 echo(1) man page（HP-UX リファレンス）

Echo
Echo
Echo
Category:Windowsアドミニストレーション
Category:通信プロトコル