如何读取破折号文件


15

我如何从终端读取破折号文件,而不是使用 ./

例如阅读一个- file我们可以通过阅读

cat ./-file_name

问:有没有其他方法可以实现同一目标?


4
推荐的方法实际上是使用./前缀。它是最可移植的(请参见Usenet时代的Unix FAQ)
Olivier Dulac

find . -name "-filename" | xargs cat将通过管道发送./-filename。对于您的情况(简化?),可能会出错,但是在大型目录/脚本中可能会有所帮助。
Walter

Answers:


11

对于从stdin获取输入的命令,可以使用重定向:

cat <-file_name

是的,这是一种方法:)是这样的,所以我有3种方法来读取它们,一种是使用./,另一种是使用<,而另一种是使用<,还有其他方法可以做同样的事情?
vidhan 2015年

22

使用double --标记选项的结尾:

cat -- -<FILENAME>

如其他方案touchrm或者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

3
您不能指望每一个实现的程序--:很多都可以,但不是全部。
格伦·杰克曼

2
真?我并不是说所有程序都实现了--,而是说其中的一些实现了。
2015年

1
@vidhan:不知道其他任何选择。
Arkadiusz Drabczyk 2015年

1
@vidhan您也可以无缘无故地使自己的生活复杂化,并做类似的事情,find . -name '-file_name' -exec cat {} \;但实际上并没有多大意义。
terdon

2
如果文件已命名-,则此方法不起作用?这在战争游戏上来:overthewire.org/wargames/bandit/bandit2.html
ThisClark

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.