複数行で構成する必要がある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
これは少し混乱を引き起こす可能性があります。