在一个Bash 初学者指南(秒。3.2.1.2.局部变量)有一个示例命令应该列出所有不在环境变量中的局部变量,或者我认为:
diff set.sorted printenv.sorted | grep "<" | awk '{ print $2 }'
我相信我了解这个命令的所有内容,除了这一*.sorted
部分。此外,该命令在我的 Bash 上不起作用,特别是由于上述因素。这是回复(这是波兰语版本没有这样的文件或目录):
diff: set.sorted: Nie ma takiego pliku ani katalogu
diff: printenv.sorted: Nie ma takiego pliku ani katalogu
值得注意的是,我使用的是 Ubuntu 14.04,其默认安装几乎没有任何更改。
因此,我无法在 Bash shell 中分析此命令,除了我从中获取此命令的教程之外,我也无法在 Google 上找到任何有关此命令的信息。
我将不胜感激您的全面解释,因为我以前从未遇到过这样的表达方式。
答案1
它们不是表达式,它们是生成的文件的文件名,如下所示:
printenv | sort > printenv.sorted
set | sort > set.sorted
文档中没有明确说明这一点,因此您的困惑是可以理解的!
请注意,您可能需要帮助diff
并grep
强制他们将输入视为文本(带有-a
);环境变量可以包含导致它们将输入视为二进制的值,这不会产生任何有用的东西:
diff -a set.sorted printenv.sorted | grep -a "<" | awk '{ print $2 }'
更好的是,使用comm
来比较两个文件:
comm -23 set.sorted printenv.sorted
您可以使用进程替换来替换文件:
comm -23 <(set|sort) <(printenv|sort)
以避免创建文件。