来自https://unix.stackexchange.com/a/458074/674
请记住
--
在将任意参数传递给命令时使用(或在可能的情况下使用重定向)。所以sort -- "$f1"
或更好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"
?
谢谢。
$f1
对于以开头-
或此处sort
开头的值的值失败+
(例如,可能对调用的文件产生严重后果-o/etc/passwd
)。(其中
--
表示选项结束)解决了大多数这些问题,但对于调用的文件仍然失败-
(它sort
解释为意味着它的标准输入)。不存在这些问题。
在这里,它是打开文件的外壳。这也意味着如果文件无法打开,你还会得到一个可能更有用的错误消息(例如,大多数 shell 会在脚本中指示行号),如果你使用错误消息将是一致的尽可能重定向以打开文件。
而在
(相反
sort -- "$f1" > out
),如果"$f1"
无法打开,out
将不会被创建/截断,sort
甚至不会运行。为了消除一些可能的混淆(按照下面的评论),如果文件本身是可搜索的,这不会阻止命令
mmap()
ing 文件或lseek()
在其中 ing (也不是)。sort
唯一的区别是文件是由 shell 更早地在文件描述符 0 上打开的,而不是稍后由命令可能在不同的文件描述符上打开的。该命令仍然可以随意搜索/映射该 fd 0。不要与cat file | cmd
this timecmd
的 stdin 是不能被映射/查找的管道混淆。问题是以破折号开头的文件名。如果 的值以开头,
sort "$f1"
则不起作用,因为该命令会将值解释为选项。这通常会导致错误,但它甚至可能导致安全漏洞。对于,双破折号参数的意思是“没有超出此点的选项”,因此 的值不会被解释为选项。但是还有一个极端情况:如果 的值是一个破折号,没有别的,那么它不是一个选项,它是参数,这意味着“标准输入”(因为参数是输入文件;对于输出文件这将意味着“标准输出”)。f1
-
sort -- "$f1"
--
f1
f1
-
使用重定向可以避免所有这些陷阱。
这适用于大多数命令,而不仅仅是
sort
.