不能管道进入差异?

use*_*394 96 command-line pipe diff

我想聪明一点,将远程文件与本地文件进行比较,而无需先手动下载它。我可以通过以下方式获取远程文件的内容

ssh user@remote-host "cat path/file.name"
Run Code Online (Sandbox Code Playgroud)

然而,管道到 diff

ssh user@remote-host "cat path/file.name" | diff path/file.name
Run Code Online (Sandbox Code Playgroud)

给我这个:

diff: missing operand after `path/file.nae'
diff: Try `diff --help' for more information.
Run Code Online (Sandbox Code Playgroud)

我设置了 ssh 密钥,所以它不会提示我输入密码。对此有什么解决方法?

Hem*_*ant 116

使用 -代表标准输入:

ssh user@remote-host "cat path/file.name" | diff path/file.name -
Run Code Online (Sandbox Code Playgroud)

  • 如果这两个文件都是通过 ssh 获取怎么办? (3认同)

use*_*394 74

这是一种解决方法:diff似乎接受 <( expr ) 作为争论:

diff <(ssh \"cat path/file.name/") <(cat path/file.name)
Run Code Online (Sandbox Code Playgroud)

  • 那不是 diff,那是 shell(bash、ksh 和 zsh 支持这种语法,但它不是 POSIX),在内核的一些帮助下(它必须提供 `/dev/fd`:`diff` 看到类似 `/dev/ fd/3` 在其命令行上)。 (22认同)
  • 我个人更喜欢这个答案。我需要区分两个不同的 XML 文件;但它们首先需要适当地形成。这导致了这个:`diff -y &lt;(xmllint --format "${1}") &lt;(xmllint --format "${2}")` 我现在一直在使用它。 (8认同)
  • 这是最酷的答案! (4认同)
  • 它不是“必须提供”——shell 也可以为此功能创建临时命名管道。 (3认同)