web-dev-qa-db-ja.com

エコーがバックスラッシュエスケープを解釈し、末尾の改行を印刷しないようにするにはどうすればよいですか?

Bashでechoを使用して文字列を出力し、その後に改行のみを出力したいと思います。私はmanページを調べましたが、echo -eechoにバックスラッシュのエスケープ文字を解釈させることがわかりました。これを使用してecho -e 'hello\r'と言うと、次のように印刷されます

$>echo -e 'hello\r'
 hello
$>

そのため、キャリッジリターンが適切に処理されたようです。また、manページのecho -nechoによる改行文字の挿入を停止し、これを実行すると機能するように見えることもわかりました

$>echo -n 'hello\r'
 hello\r$>

私が抱えている問題は、-e-nの両方を組み合わせることにあります。 echo -e -n 'hello\r'echo -n -e 'hello\r'echo -en 'hello\r'echo -ne 'hello\r'をそれぞれ試しましたが、次のように何も出力されません。

$>echo -ne 'hello\r'
$>

ここに欠けているものはありますか、または-e-nオプションを一緒に使用できませんか?

14
seanwatson

私はそれが機能していると思います、あなたはそれを見ていないだけです。これはあなたのコマンドです:

$> echo -ne 'hello\r' 

復帰(\r)があるため、カーソルはhelloを書き込んだターミナルの同じ行の先頭に残ります-つまり、次のものがターミナルに出力されます書かれます。したがって、実際のプロンプトがここに表示される$>よりも長い場合、helloは完全に上書きされます。

このシーケンスでは、実際に何が起こっているかを確認できます。

echo -ne 'hello\r'; sleep 5; echo 'good-bye'

しかし、他のシェルへの移植性を高めるために、そのようなechoでのオプションの使用は避けます。これらは純粋にバシズムであり、POSIX標準ではサポートされていません。組み込みのprintfはPOSIXで指定されています。したがって、改行なしで文字列を表示し、バックスラッシュシーケンスを解析する場合は、次のように使用できます。

printf '%s\r' 'hello'
15
Mark Reed

echoコマンドにはさまざまな実装があります。ほとんどのシェルには(それぞれに異なる動作が)組み込まれているものがあり、/bin/echoの動作はシステムによってかなり異なります。

echoではなく、printfを使用してください。これはbashに組み込まれているだけでなく、外部コマンドとしても使用でき、その動作は実装間ではるかに一貫しています。 (主なバリエーションは、GNU coreutils printf--helpおよび--versionオプションを認識することです。)

ただ使用する:

printf 'hello\r'
10
Keith Thompson

printf を紹介してください。

OP、printfに会ってください。 printf。これはOPです...

BASHの出力で何かunusualを実行しようとするときはいつでも、printfに切り替える必要があります。実際、私は常にprintfを使用しているので、スクリプトはBASHとKornshellの両方で実行できます。

BASHとKornshellは99%同じですが、echoコマンドは異なります。 Kornshellでは非推奨であり、組み込みのprintを使用することになっています。ただし、BASHにはprintはありません。 printfを使用すると、両方のシェルで同じように機能するため、問題が解決されます。

printfは自動的に各行を\nで終了しないので、\nが追加されないようにする方法について心配する必要はありません。 \nが必要な場合は、自分で配置する必要があります。あなたの場合:

printf `hello\r`

ただし、安全上の理由から、これは実際に行う必要があります。

printf '%s\r' 'hello'

これは、printfを使用しているときに私が得た習慣です。 $FOOを印刷したいとしたら、次のようにします。

printf "$FOO\n"

これは通常は機能しますが、$FOOの先頭にダッシュがある場合、または%サインインしている場合はどうなりますか。上記は私がやりたいことをしません。ただし、これを行うと:

printf '%s\n' "$FOO"

これにより、$FOOの内容に関係なく$FOOが出力されます。

6
David W.

POSIX 7 不可能だと言う

最初のオペランドが-nの場合、またはいずれかのオペランドにバックスラッシュ文字が含まれている場合、結果は実装定義です。

たとえば、Ubuntu 12.04の場合:

  • Bashの組み込みエコーecho -e '\n'は改行を解釈しますが、echo '\n'は解釈しません。
  • /bin/shの組み込みechoには-eオプションがなく、改行がなくても改行を解釈します。これは、デフォルトで/bin/shを使用するMakefilesを書き込むときにバイト化できます。

POSIX 7ソリューション:printf他の人が述べたように。

引用。それは未来の波です。常に引用する。

echo -ne 'hello\r'

変数を展開したい場合は、二重引用符を使用します。

1