【发布时间】:2013-02-10 13:49:44
【问题描述】:
当我尝试执行这样的命令时:
ssh host_1 "cat test_file | sed 's/$/\tOK/'"
我收到了这个错误:
非法变量名。
有什么问题?
【问题讨论】:
-
您能否将
sed命令更改为其他内容,直到它起作用?我怀疑$有问题... -
顺便说一句,我用我的树莓派和适用于我的 debain 计算机检查了你的代码。
当我尝试执行这样的命令时:
ssh host_1 "cat test_file | sed 's/$/\tOK/'"
我收到了这个错误:
非法变量名。
有什么问题?
【问题讨论】:
sed 命令更改为其他内容,直到它起作用?我怀疑$ 有问题...
尝试转义美元符号:
ssh host_1 "cat test_file | sed 's/\$/\\tOK/'"
【讨论】:
我认为你必须转义特殊字符:
ssh host_1 "cat test_file | sed 's/\$/\\tOK/'"
【讨论】:
当你跑步时
ssh host_1 "cat test_file | sed 's/$/\tOK/'"
您的本地 shell 首先对其参数执行参数扩展。命令为ssh,第一个参数为host_1,第二个参数为"cat test_file | sed 's/$/\tOK'"。由于第二个参数在双引号中,因此尝试了参数扩展。但是,$/ 不是bash 中的有效参数。请注意,单引号只是双引号字符串中的文字字符;它们不保护美元符号不受参数扩展的影响。因此,您需要像其他问题中指出的那样转义美元符号。
命令执行后,远端的shell会收到如下字符串:
cat test_file | sed 's/$/\tOK'.
双引号消失了,因为它们在本地 shell 删除引号期间被删除。美元符号现在同样未转义。现在,由于远程 shell 将 sed 的第一个参数视为单引号字符串,因此不执行参数扩展,并且美元符号无需转义。
【讨论】:
我终于知道发生了什么。
当答案对你有用而不是对我有用时,我发疯了。你们的答案是完全正确的。但是问题是我使用的是 csh 而不是 ksh,每个人都以不同的方式解释命令(参数扩展)。
谢谢你们。
【讨论】: