私はそれecho -eが普通のコマンドではないことを知っています。私が試してみましたecho '-e'し、echo \-e彼らはまだ仕事を`tの。
echo -- -e機能しません。通常、(少なくともGNUユーティリティでは)二重ダッシュはオプションの終わりを示し、残りはリテラル引数として保持されます。
echo再び狂気。人々が使用するだけでprintf、決して振り返らない場合。
私はそれecho -eが普通のコマンドではないことを知っています。私が試してみましたecho '-e'し、echo \-e彼らはまだ仕事を`tの。
echo -- -e機能しません。通常、(少なくともGNUユーティリティでは)二重ダッシュはオプションの終わりを示し、残りはリテラル引数として保持されます。
echo再び狂気。人々が使用するだけでprintf、決して振り返らない場合。
回答:
改行付き
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が上書きされます)
bashのecho組み込みの動作は、bashのバージョンによって異なる場合があります。また、環境(POSIXLY_CORRECT、SHELLOPTSおよびBASHOPTS変数)、オプション(posix、xpg_echo)、ビルドオプション、およびargv[0](shvs bash)にも依存します。ここではGNU bash 4.2.53(1)、デフォルトのビルド、デフォルトのオプション、空の環境でテストされ、として呼び出されbashます。でも動作しzsh 5.0.5ます。
echo -e 'x\b-e'
echoコマンドでそれを行う方法を尋ねたため。態度は必要ありません。
echo -e ' \b-e'space-backspace-dash-eを出力します。端末に表示されるだけで、ダッシュeであるかのような錯覚を与えます。
echo -e "\0-e"出力しますNUL-dash-e。これは、端末がNUL文字ことを無視することだけです(NULsも)フロー制御をサポートしていませんでしたキャリッジリターンのような他の長いものを行うためにそれらの時間を与えるためにいくつかの端末(に送られていました。下のセクションを参照してください遅延とパディングではterminfo(5)。)
最良の解決策はを使用すること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
echo -eは、移植性があると書かれています。それは-n避けなければならないと言い、エスケープシーケンスは避けなければならない。echo -e両方を避けます。ただし、回答の最後の部分で示したように、GNUシステムでechoは、デフォルトでPOSIXに準拠する必要はまったくなく、POSIXはPOSIXシステム間での移植性のみを記録します。
-eリンクした仕様の部分でカバーされていないようです。それをカバーするリンクまたは引用を提供できますか?
-e言及されていない、したがって-e移植可能な(ここでも、POSIXシステム間で)使用法をリストします。公平を期すために、引用したものは参考情報ですが、規範的なテキストは同じことを示しています。
echoするには、標準に反する方法で動作が定義されていないすべての引数を発行する必要があります。したがって、-POSIX仕様でカバーされている他のほとんどすべてのコマンドラインツールとは異なり- echo実際には、指定されていない引数の動作を指定します。仕様を破らない限り、新しいフラグを追加する余地はありません。
OPTIONSセクションを参照してくださいImplementations shall not support any options。
文字にASCIIコードを使用するGNU echoの場合-e:
$ /bin/echo -e '\055'e
-e
0558進数のASCII番号です-(man asciiクイックリファレンスについては、を参照してください)。
/bin/echo確かにPOSIX仕様です。ただし、8進エスケープシーケンスの解釈は、ベースライン仕様のXSI拡張です。
-eが拡張であることを考えると、純粋なPOSIXの動作を強制する方法はありechoますか?そうすれば、これに関するすべての不確実性がなくなると思います。
POSIXLY_CORRECT=1すると、GNUはPOSIX準拠の動作になります/bin/echo。
明白で標準的で推奨される解決策はを使用printfするechoことですが、実装によっては(ただしそれほど複雑では-nありませんが)非常に扱いにくい場合があります。
echosPOSIX は 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組み込みdash、ksh88、Bourneシェル、CSH、tcshの、上流階級、RC、ES、akangaecho(/bin/echoGNUシステム上)POSIXLY_CORRECT。echo組み込みmkshとその他のいくつかのpdksh-derivsは、posixオプションが有効な場合に派生します。echo組み込みのyash際に$ECHO_STYLEどちらか未設定またはの一つですSYSV、XSI、BSD、DASH、RAW-e含まれechoた研究のUnix(それはから来ている)V8、GNU、busyboxの、のechoの組み込みbash、zsh、pdksh及びその誘導体、fishいくつかのashbusyboxのようなベースのシェルshまたはshいくつかのBSDの、最近のバージョンksh93(一部のシステムでは、とのいくつかの値を持ちます$PATH)デフォルトの設定で、yashと$ECHO_STYLEの1 GNUかZSH:
echo -e '-e\n\c'
をサポートする実装は-e常にをサポートするため-n、次のようになります。
echo -ne '-e\n'
同様に動作します。
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を使用する場合のように、バイトのすべてのシーケンスが有効な文字を形成できるわけではないロケールでは、任意のバイトシーケンスは使用できません)。
-n改行を避けるために使用:
$ echo -n - && echo e
-e
zsh-echo-n-e-n
echo通常は組み込みシェルですが、通常はもあり/usr/bin/echoます。これ-eはPOSIXではありませんが、たとえばbashで利用できます。「まだ機能しない」の意味を詳しく教えてください。予想される動作は何ですか?