我正在尝试将参数添加到标志批处理开始。这是它给我的错误。关于如何解决此问题的任何想法?
$ sed -i "s/batch_start.*/batch_start\ 1111/" /tmp/runfile
sed: -e expression #1, char 27: unterminated `s' command
答案 0 :(得分:0)
根本问题是命令是通过ssh
发送的;这意味着它正在经历两个层次的外壳解析,一个层次是在本地计算机上,然后是另一层次在远程计算机上。这意味着它需要两次执行引号/转义解析,应用程序和删除操作,因此您需要两个“层”来进行引号/转义。
最后一条注释中的命令无法解析(引号不匹配),但是我可以使用以下命令重现错误消息:
ssh remoteHost "sudo sed -i "s/batch_start.*/batch_start\ 1111/" /tmp/runfile"
这种排序有两个级别的引号,但是引号不会嵌套,因此不起作用。本地外壳程序将其解析为双引号字符串"sudo sed -i "
,然后是未引用的节s/batch_start.*/batch_start\ 1111/
(其中包含转义的空格,因此它将删除转义符),然后是另一个双引号的节:{ {1}}。由于它们之间没有空格,它们都作为单个参数传递给" /tmp/runfile"
。通过将ssh
替换为ssh remoteHost
,可以看到解析后的字符串:
echo
...这就是远程外壳程序将执行的命令。由于$ echo "sudo sed -i "s/batch_start.*/batch_start\ 1111/" /tmp/runfile"
sudo sed -i s/batch_start.*/batch_start 1111/ /tmp/runfile
和s/batch_start.*/batch_start
之间有一个空格,它们作为单独的参数传递给1111/
,并且将第一个视为要执行的命令(缺少闭合的{{1} }),第二个作为文件名。
解决方案:有很多方法可以更正报价。您可以使用sed
技巧来查看将发送到远程Shell的内容。我倾向于在整个命令周围加上单引号,然后通常在其中加引号(只要内部命令本身不包含单引号)。在这种情况下,这意味着:
/
在远程计算机上执行此操作
echo
(请注意,我删除了空间上的转义符。)