我在bash脚本中有一个变量$ data和变量$ file:
data=$(echo "$(printf '%s\n' "${array[@]/%/$'\n\n'}")") file=$(<scriptfile_results)
那些变量将包含文本。如何比较这两个?一个选择是使用diff(1)实用程序,如下所示:
diff -u <(echo "$data") <(echo "$file")
这是比较两个变量的内容的正确优雅方式吗?另外,<()技术如何被调用?据了解,对于每个<(),一个临时文件(命名管道)被创建..
是的,diff<(echo“$ foo”)<(echo“$ bar”)很好。 通过搜索
bash manpage中的字符<(你可以发现这被称为“进程替换”。 您不需要担心创建临时文件的效率,因为临时文件实际上只是一个管道,而不是磁盘上的文件。尝试这个:
$ echo <(echo foo) /dev/fd/63
这表明临时文件实际上只是管道“文件描述符63.”虽然它出现在虚拟/ dev文件系统上,但磁盘从不被触摸。
您可能需要担心的实际效率问题是“进程替换”的“进程”部分。Bash将另一个进程执行echo foo。在某些平台上,如Cygwin,如果经常执行,这可能非常慢。然而,在大多数现代平台上,分叉速度非常快。我只是尝试通过运行脚本一次进行1000个进程替换:
echo <(echo foo) <(echo foo) ... 997 repetitions ... <(echo foo)
在我的旧Mac笔记本电脑上花了0.225秒,而在同一台笔记本电脑上运行的Ubuntu虚拟机中则为2.3秒。除了1000次调用,这表明进程替换需要不到3毫秒,这与diff的运行时间完全不同,也可能不需要担心!