web-dev-qa-db-ja.com

echoはbashスクリプトで-eパラメーターを出力します。どうすればこれを防ぐことができますか?

Echoのmanページを読みましたが、-eパラメーターを使用すると、改行のエスケープされたnなどのエスケープされた文字に特別な意味を持たせることができます。コマンドを入力すると

$ echo -e 'foo\nbar'

インタラクティブなbashシェルに入れると、期待どおりの出力が得られます。

foo
bar

しかし、これと同じコマンドを使用すると(テストケースとして、このコマンド文字を文字として試しました)、次の出力が得られます。

-e foo
 bar

これは、echoが-eをパラメーターとして解釈しているようです(改行がまだ表示されているため)が、-eをエコーする文字列として解釈します。何が起きてる? -eが表示されないようにするにはどうすればよいですか?

スクリプトの最初の行として#!/bin/bashを使用する必要があります。そうでない場合、または#!/bin/shを使用する場合、スクリプトはBourne Shellによって実行され、そのecho-eオプションを認識しません。一般に、移植性が重要な場合は、すべての新しいスクリプトでprintfではなくechoを使用することをお勧めします。

Ubuntuでは、sh/bin/dashへのシンボリックリンクによって提供されます。

34

echoのさまざまな実装は、迷惑なさまざまな方法で動作します。オプションをとらないものもあり(つまり、説明したとおりに単に-eをエコーし​​ます)、パラメーター内のエスケープシーケンスを自動的に解釈します。一部はフラグを取り、-eフラグが与えられない限りエスケープを解釈しません。フラグを取り、-eフラグが渡されたかどうかに応じて異なるエスケープシーケンスを解釈するものもあります。あなたがそれらを予測可能な方法で振る舞わせようとすると、いくつかはあなたにあなたの髪を引き裂かせるでしょう...ああ、待ってください、それはそれらのすべてです。

ここでおそらく見られるのは、echoに組み込まれているbashのバージョンと/bin/echoのバージョン、または他のシェルの組み込みバージョンとの違いです。これは、Mac OS X v10.5にbashが組み込まれていて、すべてのスクリプトが期待していたものとは異なり、フラグをエコーするechoが付属しているときに私を悩ませました...

いずれにせよ、解決策があります。代わりにprintfを使用してください。常に最初の引数(フォーマット文字列)のエスケープシーケンスを解釈します。問題は、改行が自動的に追加されないことです(したがって、明示的に追加することを覚えておく必要があります)。また、最初の引数(結局のところ、フォーマット文字列)の%シーケンスも解釈します。一般に、すべてのフォーマット要素をフォーマット文字列に入れてから、残りの引数に変数文字列を入れて、出力への補間に使用する%フォーマットによってそれらがどのように解釈されるかを制御できるようにします。 。いくつかの例:

printf "foo\nbar\n"      # this does what you're trying to do in the example
printf "%s\n" "$var"     # behaves like 'echo "$var"', except escapes will never be interpreted
printf "%b\n" "$var"     # behaves like 'echo "$var"', except escapes will always be interpreted
printf "%b\n" "foo\nbar" # also does your example
4
Gordon Davisson

使用する

エイリアスエコー/ usr/bin/echo

'-e'パラメータを解釈するcoreutils'echoを呼び出す 'echo'を強制します。

1
Huang F. Lei

これを試して:

import subprocess

def bash_command(cmd):
    subprocess.Popen(['/bin/bash', '-c', cmd])

code="abcde"
// you can use echo options such as -e
bash_command('echo -e "'+code+'"')

出典: http://www.saltycrane.com/blog/2011/04/how-use-bash-Shell-python-subprocess-instead-binsh/

0