为什么 `sort < "$f1" ` 优于 `sort -- "$f1"`,为什么它优于 `sort "$f1"`?

为什么 `sort < "$f1" ` 优于 `sort -- "$f1"`,为什么它优于 `sort "$f1"`?

https://unix.stackexchange.com/a/458074/674

记得使用-- 将任意参数传递给命令时(或尽可能使用重定向)。所以sort -- "$f1"或者更好地sort < "$f1"代替sort "$f1".

为什么优先使用--和重定向?

为什么sort < "$f1"优先于sort -- "$f1"

为什么 sort -- "$f1"优先于sort "$f1"

谢谢。

答案1

sort "$f1"

$f1对于以 开头的值-或此处对于sort以 开头的值的情况失败(例如,+可能会对调用的文件产生严重后果)。-o/etc/passwd

sort -- "$f1"

(其中-- 表示选项结束)解决了大部分问题,但对于调用的文件仍然失败-(它sort解释为其标准输入)。

sort < "$f1"

不存在这些问题。

在这里,是打开文件的 shell。这也意味着,如果文件无法打开,您还会收到一条可能更有用的错误消息(例如,大多数 shell 会指示脚本中的行号),并且如果您使用尽可能重定向以打开文件。

并且在

sort < "$f1" > out

(与sort -- "$f1" > out)相反,如果"$f1"无法打开,out则不会被创建/截断,甚至sort不会运行。

为了消除一些可能的混淆(下面的注释),如果文件本身是可查找的,则这不会阻止命令mmap()ing 文件或lseek()ing 文件内部(两者都不会)。sort唯一的区别是文件是由 shell 较早在文件描述符 0 上打开的,而不是稍后通过可能在不同文件描述符上的命令打开的。该命令仍然可以根据需要查找/映射 fd 0。不要将这与cat file | cmd这次cmd的 stdin 是无法进行映射/查找的管道相混淆。

答案2

问题是文件名以破折号开头。如果 的值以以下开头,则sort "$f1"不起作用,因为该命令将该值解释为选项。这通常会导致错误,但甚至可能f1-造成安全漏洞。和sort -- "$f1"双破折号参数的--意思是“除此之外没有其他选择”所以 的值f1不会被解释为一个选项。但仍然存在一种边缘情况:如果 的值f1是破折号而没有其他内容,那么它不是一个选项,而是参数-,这意味着“标准输入”(因为参数是输入文件;对于输出文件这意味着“标准输出”)。

使用重定向可以避免所有这些陷阱。

这适用于大多数命令,而不仅仅是sort.

相关内容