我有一个脚本如下:
#!/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/