使用Bash将大量文本回显到文件

时间:2011-08-01 08:43:55

标签: bash

我需要运行一个Bash脚本,它可以将300行Groovy脚本回显到tmp文件。 最好的方法是什么?

我目前的解决方法是将脚本文件放到网上并下载。

3 个答案:

答案 0 :(得分:46)

使用heredoc语法将其他脚本嵌入shell脚本中:

cat > file.tmp <<'endmsg'
script goes here...
endmsg

答案 1 :(得分:23)

heredoc方法很棒,但你不能天真地使用它:

  • 在粘贴的内容中没有保留空格和制表符的问题很难在屏幕上阅读,并且可能会被文本编辑器的自动清理功能触发
  • 如果您使用的heredoc结束标记出现在粘贴的内容中,则操作将提前结束 - 如果内容具有自己的heredoc并使用“EOF”等常用标记,则会出现问题。

这意味着天真的heredoc方法可以成功或失败,具体取决于所粘贴的确切内容。这违反了最少惊奇的原则,并且因为半随机而非常危险。

我更喜欢使用base64 uuencode首先捕获内容的方法。这消除了取决于内容的不同行为的可能性,因此您再也不必考虑这一点。

更安全的方法:

  1. 确定要捕获的内容,比如whatever.sh
  2. uuencode -m whatever.sh whatever.sh >tmp
  3. 将tmp的内容粘贴到脚本包装器
  4. 使用base64中不会出现的heredoc标记
  5. 最终的脚本如下:

    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