echoコマンドとリダイレクト演算子を使用してファイルに改行特殊文字を入れるには?

echoコマンドとリダイレクト演算子を使用してファイルに改行特殊文字を入れるには?

複数行で構成する必要があるechoコマンドとリダイレクト演算子を使用してファイルを作成したいと思います。

文字列に "\n" 改行文字を含めてみました。

echo "first line\nsecond line\nthirdline\n" > foo

ただし、3行のファイルを生成するのではなく、1行と文字列の逐語的な内容でのみファイルを生成します。

このコマンドのみを使用して複数行のファイルを作成するにはどうすればよいですか?

答え1

echoコマンドでいくつかの構文を要求しました。

echo $'first line\nsecond line\nthirdline' > foo

(しかし、あなたが得る他の答えも考慮してください。)

この$'...'構造は、組み込みのANSIエスケープシーケンスを拡張します。

答え2

文字エスケープに対するエコーの効果は実装によって定義されます。ほとんどの最新実装を含む多くのecho実装では、デフォルトで渡された文字列のエスケープはまったく解決されません。

GNU bash(組み込み)が提供するechoと他のいくつかのechoバリアントを使用すると、次のことができます。

echo -en 'first line\nsecond line\nthird line\n' > file

しかし、それはあなたが望むように聞こえますprintf。これは私にとってよりきれいで移植性に優れています。 (この機能はPOSIXで定義されています。)

printf '%s\n' 'first line' 'second line' 'third line' > file

以下を使用することも検討できます。ここのドキュメント:

cat > file << 'EOF'
first line
second line
third line
EOF

答え3

コマンドを使用して複数行ファイルを作成する他の方法は次のとおりですecho

echo "first line"  >  foo
echo "second line" >> foo
echo "third line"  >> foo

これらのコマンドの2番目と3番目は>>リダイレクト演算子を使用します。これにより、コマンド出力がファイル(この時点ですでに存在する必要がある)に追加(追加)されます。

または

(echo "first line"; echo "second line"; echo "third line") > foo

ここで、括弧は、echoコマンドを複数行を出力する単一のプログラムのように見え、動作する子プロセスにグループ化しますls

上記の微妙な変化は

{ echo "first line"; echo "second line"; echo "third line";} > foo

これは少し子プロセスを生成しないので、2番目の答えよりも効率的です。しかし、構文は少しトリッキーです。後ろにはスペースを入れ、{前にはセミコロンを付ける必要があります}

バラよりシェルの制御およびリダイレクト演算子は何ですか?より多くの情報を知りたいです。

答え4

POSIX 7ではできないと言います。

http://pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html

-e未定義、バックスラッシュは実装によって定義されます。

最初のオペランドが-nの場合、またはオペランドに<backslash>文字が含まれている場合、結果は実装に従って定義されます。

オプションのXSI拡張がない限り。

だから使用printf代わりに:

書式オペランドは、XBDファイル書式表記[...]で説明されている書式文字列として使用されます。

これファイル形式表記:

\n <newline> 印刷位置を次の行の先頭に移動します。

さらに、Ubuntu 15.10とほとんどのディストリビューションは、次echoのように両方を実装します。

  • 内蔵バッシュ:help echo
  • スタンドアロン実行可能ファイル:which echo

これは少し混乱を引き起こす可能性があります。

関連情報