当我尝试执行这样的命令时:
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/'"
当你跑
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,每个人都以不同的方式解释命令(参数扩展)。
谢谢你们。