rju*_*ney 2 bash newline quote
无论我做什么,我都无法在引号中使用引号来保持输出.我是什么做的?这是OS X中的bash.我的代码在这里:Gist
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 "$@"
EOF
)
echo $sbt_text
#!/bin/bash > SBT_OPTS="-Xms512M -Xmx1536M -Xss1M -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=256M"; > java -jar /sbt-launch.jar ""
Run Code Online (Sandbox Code Playgroud)
你可能想要的是这个:
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 "$@"
EOF
echo "$sbt_text"
Run Code Online (Sandbox Code Playgroud)
虽然你的read命令不像发布的那样工作,但是双引号 $sbt_text不会总是执行分词(以及路径名扩展(globbing)),当传递给echo它时,意味着任何内部空格被规范化为单个空格.
为了保持一个变量的值作为,是在POSIX的炮弹一样 -没有它经受了shell扩展上述- 你必须双引号的.
关于read命令,请注意:
-r防止通常意外地解释\输入中的实例.IFS=确保here-document中的每一行都按原样保留(不修剪前导和尾随空格)$(...))cat,因为<<(here-document)直接提供stdin输入,这是read从其输入的地方.
sbt_text=$(...)在read命令中使用,你基本上输出命令的replace($(...))部分(最终无效的)变量名而不是提供输入,导致read仍然等待stdin输入.sbt_text=$(cat <<"EOF" ...)(没有read)几乎可以给你你想要的东西(虽然以调用外部实用程序为代价cat),除了命令替换会剥离任何尾随换行符.