異なるシェルで「echo -e」を使用したエスケープシーケンス


20

Linuxのシェルに-eは、echoコマンドのフラグが存在しないように思えます。これはめちゃくちゃな設定ですか、それとも「通常」ですか?

例としてのコード:

#!/bin/sh
echo -e "\e[3;12r\e[3H"

プリント:

-e \e[3;12r\e[3H

これは以前に機能しました!いくつかのsttyコマンドがひどく間違っていて、今はもう機能しないと思います。誰かが私shが実際にちょうどであると提案しましたbash


「Linuxシェル」のようなものはありません。たとえば、Debian のパッケージecho/bin/shdash(カーネルとしてLinuxまたはFreeBSDを使用できるオペレーティングシステム)で提供されるシェルビルトインがあります
ステファンシャゼル

これが、必要なときにエスケープ文字をスクリプトに入れる理由です。

回答:


20

あなたが使ったのshではないbashので、echoコマンドインにshオプションがありません-eshマンページから:

echo [-n] args...
            Print the arguments on the standard output, separated by spaces.
            Unless the -n option is present, a newline is output following the
            arguments.

そして、それもありません\e

        If any of the following sequences of characters is encountered
        during output, the sequence is not output.  Instead, the specified
        action is performed:

        \b      A backspace character is output.

        \c      Subsequent output is suppressed.  This is normally used at
                the end of the last argument to suppress the trailing new
                line that echo would otherwise output.

        \f      Output a form feed.

        \n      Output a newline character.

        \r      Output a carriage return.

        \t      Output a (horizontal) tab character.

        \v      Output a vertical tab.

        \0digits
                Output the character whose value is given by zero to three
                octal digits.  If there are zero digits, a nul character
                is output.

        \\      Output a backslash.

        All other backslash sequences elicit undefined behaviour.

5
いくつかのsh実装はサポートしますecho -ebashサポートしないようにコンパイル時に言うことができますecho -eその特定のsh(おそらくdash)はサポート-ebashいないのにその特定のshはサポートしているだけです。
ステファンシャゼラス

17

-eはPOSIXではありません(実際、POSIXエコーは一般にオプションを受け入れませんが(サポートは許可されていますが-n)、こちらを参照)、/bin/shシステム上ではPOSIXシェルのように見えます。-eはいくつかのシェルで受け入れられる拡張機能ですが、それに依存するべきではなく、移植性がありません。理想的には、を使用するprintfか、を持つシェルを使用するように切り替えますecho -e

また、\e以下のコメントの注意事項も参照してください\033

printf '\033[3;12r\033[3H'

3
gnoucが指摘するように、どちらshも認識しません\e。使用\033
リチ

4

いつでも、ほとんどすべてのシェルで、type echoまたはを入力することで、どの「エコー」が呼び出されるかを判断できることに注意してくださいwhich echo。通常、シェル組み込みです。そのため、どの「echo」がインストールされているか、どのシェルを使用しているかによって異なります。


4
which echo使用しないでくださいwhich。通常は外部バイナリであるため、組み込みを使用しているかどうかはわかりません。typeしかし、良いです。
クリスダウン

1
私のメインシェル(zsh)にはありますが、ビルトインです(type whichまたはによって明らかにされますwhich which)。;)
ピオジョ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.