Bashでecho
を使用して文字列を出力し、その後に改行のみを出力したいと思います。私はmanページを調べましたが、echo -e
はecho
にバックスラッシュのエスケープ文字を解釈させることがわかりました。これを使用してecho -e 'hello\r'
と言うと、次のように印刷されます
$>echo -e 'hello\r'
hello
$>
そのため、キャリッジリターンが適切に処理されたようです。また、manページのecho -n
がecho
による改行文字の挿入を停止し、これを実行すると機能するように見えることもわかりました
$>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
オプションを一緒に使用できませんか?
私はそれが機能していると思います、あなたはそれを見ていないだけです。これはあなたのコマンドです:
$> echo -ne 'hello\r'
復帰(\r
)があるため、カーソルはhello
を書き込んだターミナルの同じ行の先頭に残ります-つまり、次のものがターミナルに出力されます書かれます。したがって、実際のプロンプトがここに表示される$>
よりも長い場合、hello
は完全に上書きされます。
このシーケンスでは、実際に何が起こっているかを確認できます。
echo -ne 'hello\r'; sleep 5; echo 'good-bye'
しかし、他のシェルへの移植性を高めるために、そのようなecho
でのオプションの使用は避けます。これらは純粋にバシズムであり、POSIX標準ではサポートされていません。組み込みのprintf
はPOSIXで指定されています。したがって、改行なしで文字列を表示し、バックスラッシュシーケンスを解析する場合は、次のように使用できます。
printf '%s\r' 'hello'
echo
コマンドにはさまざまな実装があります。ほとんどのシェルには(それぞれに異なる動作が)組み込まれているものがあり、/bin/echo
の動作はシステムによってかなり異なります。
echo
ではなく、printf
を使用してください。これはbashに組み込まれているだけでなく、外部コマンドとしても使用でき、その動作は実装間ではるかに一貫しています。 (主なバリエーションは、GNU coreutils printf
が--help
および--version
オプションを認識することです。)
ただ使用する:
printf 'hello\r'
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
が出力されます。
POSIX 7 不可能だと言う :
最初のオペランドが-nの場合、またはいずれかのオペランドにバックスラッシュ文字が含まれている場合、結果は実装定義です。
たとえば、Ubuntu 12.04の場合:
echo -e '\n'
は改行を解釈しますが、echo '\n'
は解釈しません。/bin/sh
の組み込みecho
には-e
オプションがなく、改行がなくても改行を解釈します。これは、デフォルトで/bin/sh
を使用するMakefile
sを書き込むときにバイト化できます。POSIX 7ソリューション:printf
他の人が述べたように。
引用。それは未来の波です。常に引用する。
echo -ne 'hello\r'
変数を展開したい場合は、二重引用符を使用します。