我有一个脚本如下:

#!/bin/bash
SERVER=127.0.0.1
ssh root@$SERVER << EOF
   checkcommand(){
      echo "checking $1"
      command -v $1 || apt install $1
   }
   checkcommand git
EOF

这根本不起作用。我怎样才能修好它?

最佳答案

您需要防止在本地系统上计算here文档中的变量。通过将结束标记放在引号中,可以使其看起来像一个带引号的字符串。

#!/bin/bash
SERVER=127.0.0.1
ssh root@$SERVER << 'EOF'
   checkcommand(){
      echo "checking $1"
      command -v $1 || apt install $1
   }
   checkcommand git
EOF

这在Bash手册的Here Documents部分中有记录:
如果引用了word的任何部分,则分隔符是word上引号移除的结果,并且此处文档中的行不会展开。如果word未被引用,则here文档的所有行都要进行参数扩展、命令替换和算术扩展,忽略字符序列\newline,并且必须使用‘\’来引用字符‘\’‘$’`。
word引用<<之后的标记,delimiter引用here文档末尾的匹配标记。

关于linux - 如何将嵌套命令传递给命令行中的ssh?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58740831/

10-13 07:20
查看更多