私はそれ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]
(sh
vs 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"
...値がecho
dになるという知識に基づいて、コードの他の場所で特別な準備/変更を行う必要がないことを意味します。
ちなみに、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
055
8進数のASCII番号です-
(man ascii
クイックリファレンスについては、を参照してください)。
/bin/echo
確かにPOSIX仕様です。ただし、8進エスケープシーケンスの解釈は、ベースライン仕様のXSI拡張です。
-e
が拡張であることを考えると、純粋なPOSIXの動作を強制する方法はありecho
ますか?そうすれば、これに関するすべての不確実性がなくなると思います。
POSIXLY_CORRECT=1
すると、GNUはPOSIX準拠の動作になります/bin/echo
。
明白で標準的で推奨される解決策はを使用printf
するecho
ことですが、実装によっては(ただしそれほど複雑では-n
ありませんが)非常に扱いにくい場合があります。
echo
sPOSIX は echo -e
出力する必要があります-e<newline>
。だからそれだけです
echo -e
そこ。echo
その点でのPOSIX準拠s(それらのほとんどは他の点でPOSIX準拠ではありません。POSIX仕様は、に関してはほとんど役に立たないですecho
)には以下が含まれます。
echo
組み込み(実行時またはビルド時にApple macOS の場合と同様)。(として呼び出された場合のオプションも有効にすることができる場合や、あるいは環境にあります)。bash
xpg_echo
posix
/bin/sh
set -o posix; shopt -s xpg_echo
posix
sh
POSIXLY_CORRECT
SHELLOPTS=posix
/bin/echo
認定UNIXシステム(AIX、MacOSの、少なくともSolarisの場合)とほとんどのBSDのecho
組み込みdash
、ksh88
、Bourneシェル、CSH、tcshの、上流階級、RC、ES、akangaecho
(/bin/echo
GNUシステム上)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
いくつかのash
busyboxのようなベースのシェルsh
またはsh
いくつかのBSDの、最近のバージョンksh93
(一部のシステムでは、とのいくつかの値を持ちます$PATH
)デフォルトの設定で、yash
と$ECHO_STYLE
の1 GNU
かZSH
:
echo -e '-e\n\c'
をサポートする実装は-e
常にをサポートするため-n
、次のようになります。
echo -ne '-e\n'
同様に動作します。
zsh
「S echo
Iは、エンド・オブ・オプションマーカー(そのサポートを知っている唯一の実装です-
)。
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で利用できます。「まだ機能しない」の意味を詳しく教えてください。予想される動作は何ですか?