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

thi*_*one 27 bash

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

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

Bla*_*iev 47

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

cat > file.tmp <<'endmsg'
script goes here...
endmsg
Run Code Online (Sandbox Code Playgroud)

  • 用户应注意,如果粘贴的脚本包含shell变量,则第一行的引号使用至关重要 - 没有引号,它们将在cat操作之前由当前shell进行评估; 但是有了引号,它们将作为文字回显,就像粘贴一样. (9认同)

Chr*_*son 23

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

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

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

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

更安全的方法:

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

最终的脚本如下:

cat > file.tmp <<'_EOF'
begin-base64 644 whatever.sh
bHMgLWxSCmxzIC1sUgpscyAtbFIKbHMgLWxSCmxzIC1sUgpscyAtbFIKbHMg
LWxSCmxzIC1sUgpscyAtbFIKbHMgLWxSCmxzIC1sUgpscyAtbFIKbHMgLWxS
CmxzIC1sUgpscyAtbFIKbHMgLWxSCmxzIC1sUgpscyAtbFIKbHMgLWxSCmxz
IC1sUgpscyAtbFIK
====
_EOF
uudecode file.tmp
Run Code Online (Sandbox Code Playgroud)

任何一行uuencoded数据都很可能与你的heredoc标记相匹配.您可能不会使用长度为60个字符的标记:)但最后一行可能会更短,并且有可能未编码的内容可能会意外地与您的标记匹配,除非标记使用不能发生的字符(如下划线)在base64编码. _EOF永远是安全的.

引用heredoc标记也是谨慎的,'_EOF'以防止块中的shell变量扩展.我认为base64编码的有效载荷不会无意中引用shell变量,因为$它没有在base64中使用,但是引用消除了这种可能性.它还有助于建立始终引用heredoc标记的习惯,除非有理由要求shell扩展.这是另一个依赖于内容的行为,因为显然是随机的,所以很棘手.除非您知道要在内容块中进行shell扩展,否则请始终引用您的heredoc标记!

以上是手动程序.使用模板可以轻松实现相同的自动化.


The*_*ith 6

当您想要输出到需要您使用的文件时,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
Run Code Online (Sandbox Code Playgroud)