从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
.