Answers:
对于从stdin获取输入的命令,可以使用重定向:
cat <-file_name
使用double --
标记选项的结尾:
cat -- -<FILENAME>
如其他方案touch
,rm
或者git checkout
也遵守这个约定:
$ touch -- -file
$ ll
total 0
-rw-r--r-- 1 ja ja 0 Mar 10 13:13 -file
$ echo hi! >> -file
$ cat -- -file
hi!
$ rm -- -file
$ echo $?
0
警告:最好在脚本中始终使用--
after rm
。攻击者可以将--rf
文件放在目录中,rm *
并将其作为运行参数。看到这个:
$ touch A
$ touch B
$ mkdir dir
$ touch dir/C
$ touch -- -rf
$ rm *
$ ll
total 0
-rw-r--r-- 1 ja ja 0 Mar 10 13:21 -rf
糟糕,这不是我们的意思,我们不想删除目录。我们应该使用--
:
$ touch A
$ touch B
$ mkdir dir
$ touch dir/C
$ touch -- -rf
$ rm -- *
rm: cannot remove `dir': Is a directory
$ ll
total 4.0K
drwxr-xr-x 2 ja ja 4.0K Mar 10 13:22 dir
--
:很多都可以,但不是全部。
--
,而是说其中的一些实现了。
find . -name '-file_name' -exec cat {} \;
但实际上并没有多大意义。
-
,则此方法不起作用?这在战争游戏上来:overthewire.org/wargames/bandit/bandit2.html
./
前缀。它是最可移植的(请参见Usenet时代的Unix FAQ)