什么是 *.sorted 命令,为什么它在我的 bash 中不起作用?

Lur*_*rco 8 bash diff awk environment-variables

初学者Bash 指南(第3.2.1.2 节。局部变量)中有一个示例命令,它应该列出所有不在环境变量中的局部变量,或者我认为:

diff set.sorted printenv.sorted | grep "<" | awk '{ print $2 }'
Run Code Online (Sandbox Code Playgroud)

除了*.sorted部分,我相信我了解有关此命令的所有内容。此外,这个命令在我的 Bash 上不起作用,特别是因为上述元素。这是响应(这是No such file or directory的波兰语版本):

diff: set.sorted: Nie ma takiego pliku ani katalogu
diff: printenv.sorted: Nie ma takiego pliku ani katalogu
Run Code Online (Sandbox Code Playgroud)

值得注意的是,我使用的是 Ubuntu 14.04,其默认安装几乎没有变化。

正因为如此,我无法在我的 Bash shell 中分析这个命令,我也无法在谷歌上找到任何关于这个的东西,除了我从中获取这个命令的教程。

我将不胜感激,因为我以前从未遇到过这样的表达方式。

Ste*_*itt 23

它们不是表达式,它们是生成的文件的文件名,如下所示:

 printenv | sort > printenv.sorted
 set | sort > set.sorted
Run Code Online (Sandbox Code Playgroud)

文档中并不清楚,所以您的困惑是可以理解的!

请注意,您可能需要帮助diffgrep强制他们将输入视为文本(使用-a);环境变量可以包含值,这将导致它们将输入视为二进制,这不会产生任何有用的东西:

diff -a set.sorted printenv.sorted | grep -a "<" | awk '{ print $2 }'
Run Code Online (Sandbox Code Playgroud)

更好的是,使用comm来比较两个文件:

comm -23 set.sorted printenv.sorted
Run Code Online (Sandbox Code Playgroud)

您可以使用进程替换来替换文件:

comm -23 <(set|sort) <(printenv|sort)
Run Code Online (Sandbox Code Playgroud)

以避免创建文件。

  • 对于有经验的 *nix 用户来说,@StephenKitt 的推断是显而易见的。对于“初学者”指南的规定观众来说,他还不如是一个凝视水晶球的通灵者。指南的作者应该像斯蒂芬在这里所做的那样明确说明这两个命令,以便初学者能够将点连接起来。 (5认同)