【问题标题】:Use commands with parentheses like diff in shell script在 shell 脚本中使用带括号的命令,例如 diff
【发布时间】:2019-07-11 02:14:21
【问题描述】:

我想区分 2 个命令的输出

差异输出 cat file1cat file2

我发现解决办法是

diff <(cat file1) <(cat file2)

然而

如果我将其放入 shell 脚本中 括号无法识别,因为它意味着在shell脚本中调用子shell..(我想知道我所知道的是否正确)

#!bin/bash
diff <(cat $1) <(cat $2)

意外标记 `(' 附近的语法错误

有没有办法在shell脚本中使用需要括号的命令?

我试过了

 diff `<(cat $1) <(cat $2)`
 diff `<(cat $1)` `<(cat $2)`
 diff "<(cat $1) <(cat $2)"
 diff <`(`cat $1`)` <`(`cat $2`)`

但以上都不起作用

我曾经将输出转储到其他文件并比较这些文件

cat $1 > out1.txt
cat $2 > out2.txt
diff -b out1.txt out2.txt

我知道这可行,但我只是想知道是否有任何方法可以不事先将输出转储到文件中

【问题讨论】:

  • 我怀疑您正在尝试使用 sh yourScript.sh 运行脚本,它忽略了 shebang。 sh(即使它是指向 bash 的链接)不支持进程替换。
  • 是的,我用 sh 运行我的脚本,所以我可以用其他命令运行它,这样可以吗?
  • 你的 shebang 错了。 #!bin/bash != #!/bin/bash

标签: shell diff


【解决方案1】:

如果您编写包含bash 命令的脚本,则需要使用bash 运行它,而不是sh。 (考虑一下:您是否希望 rm scriptfile 运行文件中包含的 bash 命令?)

如果您想要更便携的东西,可以显式使用 FIFO(特别是 mkfifo 命令):

#!/bin/sh

mkfifo fifo1 fifo2
cat "$1" >>fifo1 &
cat "$2" >>fifo2 &
diff -b fifo1 fifo2
rm fifo1 fifo2

【讨论】:

  • 我试过 bash 并且成功了!我也想知道你这里提供的示例是否与转储文件并在 diff 命令后删除它们相同?
  • 我的示例大致是 bash 正在做的事情,除了 bash 确保 FIFO 名称不会与其他任何内容发生冲突。 FIFO 也称为“命名管道”(如| 管道运算符)。只存储一个缓冲区的数据,而不是整个文件内容。
  • 我明白了!感谢您提供所有有用的信息,从您的回复中学到了很多东西!
【解决方案2】:

我尝试了这个 test.sh 并得到了正确的输出。

#! /bin/bash
diff <(cat $1) <(cat $2)

【讨论】:

  • 这不起作用,但我认为这是因为我使用了 'sh',而不是 'bash'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-05
  • 2021-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多