コンテキスト

コンテキスト

コンテキスト

ファイルがありますmy-cmd

echo '<some data...>\\<some other data...>'

デフォルトでは、このコマンドの出力をテキストファイルにリダイレクトしたいと思います。

./my-cmd > file.txt

質問

私の問題は常にtoの>すべての項目を置き換えることです。\\\file.txt

この動作を防ぐにはどうすればよいですか?

答え1

my-cmd次のようにすれば:

echo "abc\\def"

出力は次のとおりですabc\def。バックスラッシュは二重引用符内のエスケープ文字として解釈されます。 OTOH、一重引用符内のリテラルバックスラッシュで処理されます。

echo 'abc\\def'

abc\\def出力として生成されます。

編集:これはbashでテストされました。 OPはタグを「zsh」に変更したので、彼の質問に対する答えではありません。今運営者様が無駄な内容だと思えば削除します。

答え2

echo移植できないコマンドであり、その動作は実装、バージョン、コンパイル時、ランタイムオプション、環境によって異なります。

-特に、最初の引数が次に始まる場合(zshの組み込み関数がechoこの問題を解決できるまれな実装の1つにもかかわらず)、引数にバックスラッシュ文字が含まれている場合は使用しないでください。

具体的には、zsh echo組み込み実装の場合、オプションが有効になっていない場合(ほとんどの場合はデフォルトで無効になっています)、組み込み実装の場合、\シーケンス(たとえば\n、、\c...)\61\\POSIX + XSIによって要求されるように拡張されますが、XSIはありませんPOSIX は指定されていない動作を維持します。bsdecho展開)有効になっている場合bashにのみxpg_echo拡張されるためです(ほとんどの展開ではデフォルトでは無効です)。

zshおよびsは両方とも拡張を無効にするbash echo(非標準)-Eオプションをサポートします(およびオプションがbashすべてxpg_echo有効な場合はsは有効になりません)。posix

ここでもこれを行うことができます:

echo -E '<some data...>\\<some other data...>' > file

zshほとんどの展開でうまく機能しますbash。標準コマンドを使用する方が良いでしょうprintf

printf '%s\n' '<some data...>\\<some other data...>' > file

この場合、動作はPOSIXで完全に指定され、すべての実装で同じです。

このprintfユーティリティはPOSIXの発明であることに注意してください。 POSIXの前に、echoこれらの移植不可能な混乱に対するKornシェルのソリューションは、新しい組み込みprint機能とシーケンスを-r拡張しないオプションとオプションの終わりを表示するオプションでした。実際、Kornに似た組み込み機能がありますが、そうではありません。\x-zshprintbash

kshとzshでは、次のこともできます。

print -r - "$var"

すべてのデータをそのまま印刷します。

詳細については、次を参照してください。

答え3

~によるとフレディは何と言いましたか?コメントからニカードの答えmy-cmdしなければならない:

/bin/echo -E '<some data...>\\<some other data...>'

zshだから基本的に、私はいいえ bash、デフォルトではバックスラッシュ文字を特別に処理するコマンドを使用しますechozsh使用するコマンドを指定し、その/bin/echoオプション-Eを使用して呼び出す必要があります。

man echoこの-Eオプションの説明は次のとおりです。

   -E     disable interpretation of backslash escapes

答え4

回答

ご存知のように、これは>出力リダイレクト演算子です(基本的にコマンドの出力を特定の場所にリダイレクトすることを意味します)。

複数の出力を同じファイルにリダイレクトするには、この>>コマンドを使用する必要があります。コマンドと同じ構文を使用します>が、以前にリダイレクトされたデータを完全に再構築/削除する代わりに、以下に追加します。

はい/構文

./my-cmd > file.txtだからしないでください。./my-cmd >> file.txt

関連情報