【问题标题】:sh fails to write content to a filesh 无法将内容写入文件
【发布时间】:2017-06-24 12:53:16
【问题描述】:

我正在使用magephp 将 PHP 部署到服务器。该脚本使用sh -c \" ... \" 在远程服务器上执行命令。一切正常,直到我想将一些内容写入远程服务器上的文件。

为此,我尝试运行echo 'foobar' > test.txt 命令,但由于分隔符\" 环绕该命令,该命令显然失败了。有趣的是,如果我使用非转义分隔符(即")执行命令,我可以将文件写入内容。请参阅下面的工作示例:

$ sh -c "echo 'foobar' > test.txt"

但这不起作用:

$ sh -c \"echo 'foobar' > test.txt\"
foobar: -c: line 0: unexpected EOF while looking for matching `"'
foobar: -c: line 1: syntax error: unexpected end of file

奇怪的是,在这个命令失败后,我创建了 test.txt" 文件,但没有任何内容。

有什么想法吗?

【问题讨论】:

  • 转义引号可防止它们充当引号。不要那样做。
  • 重定向是由原来的shell完成的。该文件是空的,因为sh 出错了,所以它没有打印任何东西。
  • @Inian 显然反斜杠在 magephp 脚本中。
  • 通过ssh 传递嵌套引号很棘手。您需要同时处理 ssh 对参数的解析和远程 shell 的解析。
  • 确实,反斜杠在 magephp 脚本中,当我尝试删除它们时,其他命令开始失败,所以我不想要求更改它(也将是 BC 中断)。

标签: php bash shell unix sh


【解决方案1】:

解决方案是将重定向包装(隐藏)到脚本中:

  • /my/path/print.sh

    echo '$1' > $2
    
  • 从 magephp 调用:

    sh -c \" /my/path/print.sh 'foobar' test \"
    

【讨论】:

    【解决方案2】:

    感谢大家的贡献。我们在 mage 项目中创建了该问题,并且该命令已重新设计为不使用 \" 作为分隔符。这样就完全不需要逃避的诡计了。

    https://github.com/andres-montanez/Magallanes/issues/350

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-04
      • 1970-01-01
      • 2016-09-28
      • 2012-05-18
      • 1970-01-01
      • 1970-01-01
      • 2013-08-01
      • 2010-11-09
      相关资源
      最近更新 更多