コンピュータ 分野におけるエコー (英 : echo )は、引数 として入力した文字列を出力するコマンドを指す。
エコーバック
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
ping で使われるICMP パケットを echo と呼ぶ。RFC 792 を参照。
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 システムコールを実行する)
出典
外部リンク
ファイルとファイルシステム管理 プロセス管理 ユーザ管理/環境 テキスト処理 シェル ビルトイン通信 検索 マニュアル ソフトウェア開発 その他
ファイルシステム ファイル管理 ディスク管理 プロセス管理 レジストリ ユーザ環境 テキスト処理 スクリプト ネットワーク メンテナンス ブート管理 ソフトウェア開発 その他