コンテキスト
ファイルがあります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
-
zsh
print
bash
kshとzshでは、次のこともできます。
print -r - "$var"
すべてのデータをそのまま印刷します。
詳細については、次を参照してください。
答え3
~によるとフレディは何と言いましたか?コメントからニカードの答え、my-cmd
しなければならない:
/bin/echo -E '<some data...>\\<some other data...>'
zsh
だから基本的に、私はいいえ bash
、デフォルトではバックスラッシュ文字を特別に処理するコマンドを使用しますecho
。zsh
使用するコマンドを指定し、その/bin/echo
オプション-E
を使用して呼び出す必要があります。
man echo
この-E
オプションの説明は次のとおりです。
-E disable interpretation of backslash escapes
答え4
回答
ご存知のように、これは>
出力リダイレクト演算子です(基本的にコマンドの出力を特定の場所にリダイレクトすることを意味します)。
複数の出力を同じファイルにリダイレクトするには、この>>
コマンドを使用する必要があります。コマンドと同じ構文を使用します>
が、以前にリダイレクトされたデータを完全に再構築/削除する代わりに、以下に追加します。
はい/構文
./my-cmd > file.txt
だからしないでください。./my-cmd >> file.txt