【问题标题】:Linux command with scape character带有转义字符的 Linux 命令
【发布时间】:2013-02-10 13:49:44
【问题描述】:

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

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

我收到了这个错误:

非法变量名。

有什么问题?

【问题讨论】:

  • 您能否将sed 命令更改为其他内容,直到它起作用?我怀疑$ 有问题...
  • 顺便说一句,我用我的树莓派和适用于我的 debain 计算机检查了你的代码。

标签: linux shell sed command


【解决方案1】:

尝试转义美元符号:

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

【讨论】:

  • 这对我不起作用。它给了我这个错误:变量名必须包含字母数字字符。
  • 它给了我这个错误:变量名必须包含字母数字字符。
  • 这是我可以通过一个人为的例子看到的:gist.github.com/AD7six/b108578e1bfd433f93b4
  • 这真的让我抓狂了!!我什至试图复制粘贴你的确切命令,没有运气。
  • @TuaimiAA 你用的是哪个操作系统?
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    当你跑步时

    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 的第一个参数视为单引号字符串,因此不执行参数扩展,并且美元符号无需转义。

    【讨论】:

      【解决方案4】:

      我终于知道发生了什么。

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

      谢谢你们。

      【讨论】:

      • 除非必须,否则不要使用 csh。
      猜你喜欢
      • 2013-03-04
      • 2017-05-20
      • 2015-11-30
      • 1970-01-01
      • 2019-12-08
      • 1970-01-01
      • 1970-01-01
      • 2019-02-20
      • 1970-01-01
      相关资源
      最近更新 更多