「-e」をエコーで出力するにはどうすればよいですか?


8

私はそれecho -eが普通のコマンドではないことを知っています。私が試してみましたecho '-e'し、echo \-e彼らはまだ仕事を`tの。


1
「通常のコマンドラインではない」とはどういう意味ですか?echo通常は組み込みシェルですが、通常はもあり/usr/bin/echoます。これ-eはPOSIXではありませんが、たとえばbashで利用できます。「まだ機能しない」の意味を詳しく教えてください。予想される動作は何ですか?
maxschlepzig 2014年

エコーを使用して-eを印刷したい。助言がありますか?
工場のハイライト

3
printfの使用を検討してください。より移植性があります。
Michael Durrant 2014年

1
不思議なことに十分にecho -- -e機能しません。通常、(少なくともGNUユーティリティでは)二重ダッシュはオプションの終わりを示し、残りはリテラル引数として保持されます。
Wil Cooley

6
echo再び狂気。人々が使用するだけでprintf、決して振り返らない場合。
イエンス

回答:


9
  • 改行付き

    echo -en '-e\n'
  • 改行なし

    echo -e '-e\c'
  • 周りにスペースあり:

    echo '-e '
    echo ' -e'
    
  • バックスペースの使用(Joseph Rに感謝):

    echo -e ' \b-e'

    (SPC BS-e LFを出力しますが-e、BSがカーソルを1列左に移動したときにレンダリングされるターミナルに送信されると-、SPCが上書きされます)

bashecho組み込みの動作は、bashのバージョンによって異なる場合があります。また、環境(POSIXLY_CORRECTSHELLOPTSおよびBASHOPTS変数)、オプション(posixxpg_echo)、ビルドオプション、およびargv[0]shvs bash)にも依存します。ここではGNU bash 4.2.53(1)、デフォルトのビルド、デフォルトのオプション、空の環境でテストされ、として呼び出されbashます。でも動作しzsh 5.0.5ます。


+1またecho -e 'x\b-e'
ジョセフR.

2
これらの醜く骨の不明瞭な「回避策」が賛成票を受け取るのはなぜですか?以下のCharles Duffyが適切な答えを持っています。printfを使用して、そのような問題を一度も忘れてください。
イェンス、

7
イェンス:OPがechoコマンドでそれを行う方法を尋ねたため。態度は必要ありません。
ctc 2014年

1
echo -e ' \b-e'space-backspace-dash-eを出力します。端末に表示されるだけで、ダッシュeであるかのような錯覚を与えます。
ステファンChazelas

1
@CharlesDuffy、echo -e "\0-e"出力しますNUL-dash-e。これは、端末がNUL文字ことを無視することだけです(NULsも)フロー制御をサポートしていませんでしたキャリッジリターンのような他の長いものを行うためにそれらの時間を与えるためにいくつかの端末(に送られていました。下のセクションを参照してください遅延とパディングではterminfo(5)。)
ステファンChazelas

25

最良の解決策はを使用することechoではなく、printf代わりに使用することです。

printf '%s\n' -e

これは任意の変数で機能します:

var=-e
printf '%s\n' "$var"

...値がechodになるという知識に基づいて、コードの他の場所で特別な準備/変更を行う必要がないことを意味します。


ちなみに、POSIXシェルコマンドの仕様echoは、実装時に移植できないこと認めており、その件に関する注記が含まれています。

-n(最初の引数として)とエスケープシーケンスの両方が省略されていない限り、エコーをすべてのPOSIXシステムに移植して使用することはできません。

printfユーティリティを移植可能に使用して、次のようにエコーユーティリティの従来の動作をエミュレートできます(IFSに標準値があるか、設定されていない場合)。

歴史的なSystem Vエコーと、このPOSIX.1-2008のボリュームにおけるXSI実装の要件は、次のものと同等です。

printf "%b\n" "$*"

BSDエコーは以下と同等です。

if [ "X$1" = "X-n" ]
then
    shift
    printf "%s" "$*"
else
    printf "%s\n" "$*"
fi

新しいアプリケーションでは、echoの代わりにprintfを使用することをお勧めします。

(エンファシスを追加)。


そうは言っても、GNUシステムでは、標準に準拠した動作を要求するという代替手段が存在します。

$ POSIXLY_CORRECT=1 /bin/echo -e
-e

興味深いことに、POSIXのノートにecho -eは、移植性があると書かれています。それは-n避けなければならないと言い、エスケープシーケンスは避けなければならない。echo -e両方を避けます。ただし、回答の最後の部分で示したように、GNUシステムでechoは、デフォルトでPOSIXに準拠する必要はまったくなく、POSIXはPOSIXシステム間での移植性のみを記録します。
hvd 2014年

@hvd、私が-eリンクした仕様の部分でカバーされていないようです。それをカバーするリンクまたは引用を提供できますか?
Charles Duffy

それを言うのは言及の欠如です。:)移植できない、そして-e言及されていない、したがって-e移植可能な(ここでも、POSIXシステム間で)使用法をリストします。公平を期すために、引用したものは参考情報ですが、規範的なテキストは同じことを示しています。
hvd 2014年

2
@hvd、むしろ逆です。仕様どおりに実行echoするには、標準に反する方法で動作が定義されていないすべての引数を発行する必要があります。したがって、-POSIX仕様でカバーされている他のほとんどすべてのコマンドラインツールとは異なり- echo実際には、指定されていない引数の動作を指定します。仕様を破らない限り、新しいフラグを追加する余地はありません。
Charles Duffy

2
@hvd、...その点については、白黒で示されているOPTIONSセクションを参照してくださいImplementations shall not support any options
Charles Duffy

9

文字にASCIIコードを使用するGNU echoの場合-e

$ /bin/echo -e '\055'e
-e

0558進数のASCII番号です-man asciiクイックリファレンスについては、を参照してください)。


1
/bin/echo確かにPOSIX仕様です。ただし、8進エスケープシーケンスの解釈は、ベースライン仕様のXSI拡張です。
Charles Duffy

@CharlesDuffy確かに、私は間違って話しました。printfの+1(私の最初の考えも同様)。それ-eが拡張であることを考えると、純粋なPOSIXの動作を強制する方法はありechoますか?そうすれば、これに関するすべての不確実性がなくなると思います。
muru 2014年

2
実はそうです!エクスポートPOSIXLY_CORRECT=1すると、GNUはPOSIX準拠の動作になります/bin/echo
Charles Duffy

+1おかげで、スクリプトを移植可能にして「homebrew-Linuxに依存しない」ように(つまり、職場のプロワークステーションでも作業できるように)知っておくと便利です。
syntaxerror

@Kusalanandaはこれを忘れていました。
muru

3

明白で標準的で推奨される解決策はを使用printfするechoことですが、実装によっては(ただしそれほど複雑では-nありませんが)非常に扱いにくい場合があります。

POSIX.2017準拠echos

POSIX echo -e出力する必要があります-e<newline>。だからそれだけです

echo -e

そこ。echoその点でのPOSIX準拠s(それらのほとんどは他の点でPOSIX準拠ではありません。POSIX仕様は、に関してはほとんど役に立たないですecho)には以下が含まれます。

  • およびオプションの両方が有効になっている場合のecho組み込み(実行時またはビルド時にApple macOS の場合と同様)。(として呼び出された場合のオプションも有効にすることができる場合や、あるいは環境にあります)。bashxpg_echoposix/bin/shset -o posix; shopt -s xpg_echoposixshPOSIXLY_CORRECTSHELLOPTS=posix
  • /bin/echo認定UNIXシステム(AIX、MacOSの、少なくともSolarisの場合)とほとんどのBSDの
  • echo組み込みdashksh88、Bourneシェル、CSH、tcshの、上流階級、RC、ES、akanga
  • が環境内にあるときのGNU echo/bin/echoGNUシステム上)POSIXLY_CORRECT
  • echo組み込みmkshとその他のいくつかのpdksh-derivsは、posixオプションが有効な場合に派生します。
  • echo組み込みのyash際に$ECHO_STYLEどちらか未設定またはの一つですSYSVXSIBSDDASHRAW

サポートする実装 -e

含まれechoた研究のUnix(それはから来ている)V8、GNU、busyboxの、のechoの組み込みbashzshpdksh及びその誘導体、fishいくつかのashbusyboxのようなベースのシェルshまたはshいくつかのBSDの、最近のバージョンksh93(一部のシステムでは、とのいくつかの値を持ちます$PATH)デフォルトの設定で、yash$ECHO_STYLEの1 GNUZSH

echo -e '-e\n\c'

をサポートする実装は-e常にをサポートするため-n、次のようになります。

echo -ne '-e\n'

同様に動作します。

zsh

zsh「S echoIは、エンド・オブ・オプションマーカー(そのサポートを知っている唯一の実装です-)。

echo - -e

echo任意のデータを出力できる唯一のBourneのようなシェルにする(これは、変数とその組み込み関数の引数でNULバイトをサポートする唯一のシェルであるため)を使用してecho -E - "$data"

NULバイトの問題を除いて、任意のデータを出力できる他の実装は、次のことができるFreeBSDまたはmacOS /bin/echoです。

/bin/echo "$data
\c"

(その実装で\cは、最後にのみ認識され、他のエスケープシーケンスはサポートされていません)。

そしてyash

ECHO_STYLE=RAW echo "$data"

(ただし、yash変数はテキストのみを保持できることに注意してください。そのため、charmapとしてUTF-8を使用する場合のように、バイトのすべてのシーケンスが有効な文字を形成できるわけではないロケールでは、任意のバイトシーケンスは使用できません)。


2

-n改行を避けるために使用:

$ echo -n - && echo e
-e

それはでは動作しませんオプションの区切りの、またはすべての端でサポートしない実装は(それらのそのサポートはまた、サポートが)zsh-echo-n-e-n
ステファンChazelas
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.