2016-03-24 5 views
2

私が何をしても、改行を引用符で囲んで出力に残すことはできません。どうしようかな?これは、OS Xの私のコードではbashでここにある:Gistbashで引用符で改行を生成できないのはなぜですか?

read -d '' sbt_text=$(cat <<"EOF" 
#!/bin/bash 
SBT_OPTS="-Xms512M -Xmx1536M -Xss1M -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=256M"; 
java $SBT_OPTS -jar `dirname $0`/sbt-launch.jar "[email protected]" 
EOF 
) 

echo $sbt_text 

#!/bin/bash > SBT_OPTS="-Xms512M -Xmx1536M -Xss1M -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=256M"; > java -jar /sbt-launch.jar "" 

答えて

6

はこれです:

IFS= read -d '' -r sbt_text <<"EOF" 
#!/bin/bash 
SBT_OPTS="-Xms512M -Xmx1536M -Xss1M -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=256M"; 
java $SBT_OPTS -jar `dirname $0`/sbt-launch.jar "[email protected]" 
EOF 

echo "$sbt_text" 

投稿としてあなたreadコマンドが動作しませんが、 二重引用符$sbt_textは、常にword splitting(さらにはpathname expansion (globbing))を実行します。 echoに渡すと、任意の内部空白がの単一スペースに正規化されることを意味します。上記shell expansionsにそれを施さず - - POSIXのようなシェルで-であるように、可変の価値を維持するために

あなたは二重引用符で囲む必要がありますそれを。 readコマンドに関して

なお:

  • -r入力における\インスタンスの通常意図しない解釈を防止します。
  • 前に付けるIFS=catcommand substitution$(...))の必要はありません
  • 空白(空白文字を先頭と末尾のノートリミング)に関するものであるとして、ここでは、文書内の各ラインが原因で<<(、保存されていることを保証しますa here-document)はstdin入力を直接提供します。これはreadからの入力を受け取ります。あなたのreadコマンドでsbt_text=$(...)を使用することにより
    • は、あなたは基本的にreadはまだ標準入力を待つ引き起こし、コマンド置換($(...))(最終的には無効)変数名ではなく入力を提供する一部の出力を作りました入力。
    • readなし)だけ割り当てsbt_text=$(cat <<"EOF" ...)を使用すると、ほとんど何をしたいあなたを与えているだろう(ただし、外部ユーティリティcatへの呼び出しを犠牲にして)、コマンド置換は、任意の末尾の改行を取り除いていたことを除いて。とき `FOO = '*' の挙動を比較`:IFSをクリアすると、 ``エコー "$ fooの" `と完全に同等であることを$ foo`をエコーするためには十分ではないことを指摘する価値
2

あなたはあなたの変数を引用する必要があります。

echo "$sbt_text" 

これは、グロブ(およびを分割単語をやってからバッシュを防止変数(パラメータ拡張)を置換した後に、*?のようなワイルドカード文字を展開します。 IFSreadに設定しても、echoコマンドラインでの単語分割は防止されません。サブシェル(()IFSはとは対照的に単語分割のための呼び出し元のシェルによって解釈されているため、ここでは必要である - 2番目の例では動作しません

IFS= echo $sbt_text ### won't work 

(IFS= ; echo $sbt_text) 

対:楽しみのためにこれを試してみてください質問のコード例でreadによって解釈されています。もちろん

、これはあまりにも動作します(ただし、 "廃墟" あなたIFS):あなたはおそらく欲しい

IFS= ; echo $sbt_text 
+1

。 –

関連する問題