エコー (コンピュータ)

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

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

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

DOSのCOMMAND.COMの内部コマンドの、ECHOコマンド（後述）において、引数がONまたはOFFという文字列の場合にオンまたはオフに制御されているのは、このエコーバックに関するモード（のようなもの）である。

また、Unix系ではCLI画面からのログイン時のパスワード入力時には、入力に対して何の反応も表示されないが、これは端末のエコーバックを無しにすることで抑制されている。コマンドで制御する場合は stty コマンドを使う。引数 `echo` と `-echo`（先頭のマイナスの有り無し）で指定する。`stty echo` でエコーバック有り、`stty -echo` でエコーバック無しになる。端末などを、いわゆるテキストユーザインタフェースで使う場合などもエコーバックが無しにされる。

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

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

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

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

問題の回避策としては、「コマンドは実行するが全く何も（空文字列すらも）出力しない」という動作以外は、printfコマンド（POSIXの記述を参照のこと。なお、printfの記事はコマンドのほうのprintfの説明ではない）を代替として使うことで解決できる。

C言語で echo プログラムを書くと、次のようになる。

 
```c
#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 は &lt;ON&gt; です。」（あるいは、&lt;OFF&gt; です。）と出力される（英語モードでは `ECHO is on.` などと出力される）。

### PHP
PHPにはechoという言語構造（language construct）がある。同じく言語構造のprintと似たようなものだが、引数を複数個付けられる点、値を返さない（voidである）点、などが異なる。

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

PWB/UNIX及びUnix System IIIにおいて、echoはC言語のエスケープシーケンスの変換をするようになった。

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

MS-DOSは、バージョン2からechoを搭載している。

## 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 リファレンス）