18

echobashで使用して、文字列の後にキャリッジリターンのみを出力したいと思います。マニュアルページを調べたところ、バックスラッシュのエスケープ文字を解釈echo -eできることがわかりました。echoそれを使って私は言うことができecho -e 'hello\r'、それはこのように印刷されます

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

したがって、キャリッジリターンは適切に処理されたようです。またecho -n、manページ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を一緒に使用できませんか?

4

5 に答える 5

19

私はそれが機能していると思います、あなたはそれを見ていません。これはあなたの命令です:

$> echo -ne 'hello\r' 

キャリッジリターン(\r)があるため、カーソルは、それが書き込んだ端末の同じ行の先頭に残ります。これは、hello端末に出力される次のものが書き込まれる場所であることを意味します。したがって、実際のプロンプトが$>ここに表示されているよりも長い場合、完全に上書きされますhello

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

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

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

printf '%s\r' 'hello'
于 2012-05-14T02:05:17.073 に答える
10

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

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

使用するだけです:

printf 'hello\r'
于 2012-05-14T02:09:38.417 に答える
7

printfを紹介していただきたいと思います。

OP、会いましょうprintfprintf。これはOPです...

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

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

printf各行が自動的にで終わるわけではないので、が追加され\nないようにする方法を心配する必要はありません。\n一体、あなたが望むなら\n、あなたはそれを自分で置かなければなりません。あなたの場合:

printf `hello\r`

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

printf '%s\r' 'hello'

これは私が使用しているときに私が習得した習慣ですprintf。印刷したい場合を想像してみて$FOOください。これを実行します。

printf "$FOO\n"

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

printf '%s\n' "$FOO"

$FOOこれは、何が含まれていても印刷され$FOOます。

于 2012-05-14T02:41:12.760 に答える
2

POSIX 7はそれが不可能だと言っています

最初のオペランドが-nの場合、またはいずれかのオペランドに円記号が含まれている場合、結果は実装定義になります。

たとえば、Ubuntu 12.04の場合:

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

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

于 2013-07-28T15:33:46.800 に答える
1

引用。それは未来の波です。常に引用してください。

echo -ne 'hello\r'

展開する変数を内部に配置する場合は、二重引用符を使用してください。

于 2012-05-14T01:28:22.240 に答える