Bla*_*iev 47
使用heredoc语法将其他脚本嵌入到shell脚本中:
cat > file.tmp <<'endmsg'
script goes here...
endmsg
Run Code Online (Sandbox Code Playgroud)
Chr*_*son 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
Run Code Online (Sandbox Code Playgroud)
任何一行uuencoded数据都很可能与你的heredoc标记相匹配.您可能不会使用长度为60个字符的标记:)但最后一行可能会更短,并且有可能未编码的内容可能会意外地与您的标记匹配,除非标记使用不能发生的字符(如下划线)在base64编码. _EOF永远是安全的.
引用heredoc标记也是谨慎的,'_EOF'以防止块中的shell变量扩展.我认为base64编码的有效载荷不会无意中引用shell变量,因为$它没有在base64中使用,但是引用消除了这种可能性.它还有助于建立始终引用heredoc标记的习惯,除非有理由要求shell扩展.这是另一个依赖于内容的行为,因为显然是随机的,所以很棘手.除非您知道要在内容块中进行shell扩展,否则请始终引用您的heredoc标记!
以上是手动程序.使用模板可以轻松实现相同的自动化.
当您想要输出到需要您使用的文件时,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)