我需要运行一个Bash脚本,它可以将300行Groovy脚本回显到tmp文件。 最好的方法是什么?
我目前的解决方法是将脚本文件放到网上并下载。
答案 0 :(得分:46)
使用heredoc语法将其他脚本嵌入shell脚本中:
cat > file.tmp <<'endmsg'
script goes here...
endmsg
答案 1 :(得分:23)
heredoc方法很棒,但你不能天真地使用它:
这意味着天真的heredoc方法可以成功或失败,具体取决于所粘贴的确切内容。这违反了最少惊奇的原则,并且因为半随机而非常危险。
我更喜欢使用base64 uuencode首先捕获内容的方法。这消除了取决于内容的不同行为的可能性,因此您再也不必考虑这一点。
更安全的方法:
uuencode -m whatever.sh whatever.sh >tmp
最终的脚本如下:
cat > file.tmp <<'_EOF'
begin-base64 644 whatever.sh
bHMgLWxSCmxzIC1sUgpscyAtbFIKbHMgLWxSCmxzIC1sUgpscyAtbFIKbHMg
LWxSCmxzIC1sUgpscyAtbFIKbHMgLWxSCmxzIC1sUgpscyAtbFIKbHMgLWxS
CmxzIC1sUgpscyAtbFIKbHMgLWxSCmxzIC1sUgpscyAtbFIKbHMgLWxSCmxz
IC1sUgpscyAtbFIK
====
_EOF
uudecode file.tmp
任何一行uuencoded数据都很可能与你的heredoc标记相匹配。您可能不会使用长度为60个字符的标记:)但最后一行可能会更短,并且有可能未编码的内容可能会意外地与您的标记匹配,除非标记使用不能发生的字符(如下划线)在base64编码。 _EOF
始终是安全的。
引用像'_EOF'
这样的heredoc标记以防止块中的shell变量扩展也是谨慎的。我认为base64编码的有效负载不会无意中引用shell变量,因为base64中没有使用$
,但引用消除了这种可能性。它还有助于建立始终引用heredoc标记的习惯,除非有理由要求shell扩展。这是另一个依赖于内容的行为,因为显然是随机的,所以很棘手。除非您知道要在内容块中进行shell扩展,否则请始终引用您的heredoc标记!
以上是手动程序。使用模板可以轻松实现相同的自动化。
答案 2 :(得分:5)
如果要输出到需要使用sudo
的文件,答案是完全不明显的!
sudo tee /etc/php/conf.d/xdebug.ini > /dev/null <<'TXT'
zend_extension=xdebug.so
xdebug.remote_enable=on
xdebug.remote_autostart=on
xdebug.remote_host=127.0.0.1
xdebug.remote_port=9000
xdebug.remote_handler=dbgp
TXT