![使用进程替换时,破折号报告“语法错误:“(”意外”](https://linux22.com/image/50758/%E4%BD%BF%E7%94%A8%E8%BF%9B%E7%A8%8B%E6%9B%BF%E6%8D%A2%E6%97%B6%EF%BC%8C%E7%A0%B4%E6%8A%98%E5%8F%B7%E6%8A%A5%E5%91%8A%E2%80%9C%E8%AF%AD%E6%B3%95%E9%94%99%E8%AF%AF%EF%BC%9A%E2%80%9C(%E2%80%9D%E6%84%8F%E5%A4%96%E2%80%9D.png)
我有以下 bash 命令
diff <(xzcat file1.xz) <(xzcat file2.xz)
我需要在 中执行它dash
。在我的系统(Debian Wheezy)上,dash
是 cron 的默认解释器(/bin/sh
是 的链接/bin/dash
)。
当我执行 中的命令时dash
,出现以下错误:
Syntax error: "(" unexpected
答案1
如果您在从 cron 作业运行某些内容时需要特定的 shell,请将其包装在脚本中并从 cron 调用该脚本。
#!/bin/bash
diff <(xzcat file1.xz) <(xzcat file2.xz)
定时任务入口
* * * * * user-name /path/to/above/script.bash
答案2
是的,进程替换是起源于 ksh 的非标准功能,仅在 ksh、bash 和 zsh 中可用。
在支持的系统/dev/fd/n
(如 Debian)上,您可以执行以下操作:
xzcat < file1.xz | { xzcat < file2.xz | diff /dev/fd/3 -; } 3<&0
或者你总是可以这样做:
bash -c 'diff <(xzcat file1.xz) <(xzcat file2.xz)'
答案3
如果你必须使用dash
,这将起作用:
mkfifo file1
mkfifo file2
xzcat file1.xz >file1&
xzcat file2.xz >file2&
diff file1 file2
rm -f file1 file2 #remove the FIFOs