-2

当我尝试执行这样的命令时:

ssh host_1 "cat test_file | sed 's/$/\tOK/'"

我收到了这个错误:

非法变量名。

问题是什么?

4

4 回答 4

4

尝试转义美元符号:

ssh host_1 "cat test_file | sed 's/\$/\\tOK/'"
于 2013-02-10T13:52:00.487 回答
2

我认为您必须转义特殊字符:

ssh host_1 "cat test_file | sed 's/\$/\\tOK/'"
于 2013-02-10T13:52:12.963 回答
2

当你跑

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看成是一个单引号字符串,所以不执行参数扩展,并且不需要转义美元符号。

于 2013-02-10T15:10:56.327 回答
0

我终于知道发生了什么。

当答案对你有用而不是对我有用时,我疯了。你们的答案是完全正确的。但是问题是我使用的是 csh 而不是 ksh,每个人都以不同的方式解释命令(参数扩展)。

谢谢你们。

于 2013-02-12T08:08:56.020 回答