web-dev-qa-db-ja.com

ダッシュファイルの読み方

./で区切る以外に、ターミナルからダッシュファイルを読み取るにはどうすればよいですか

たとえば、- fileを読み取るには、

cat ./-file_name

Q:同じことを達成する別の方法はありますか?

15
vidhan

Stdinから入力を取得するコマンドの場合、リダイレクトを使用できます。

cat <-file_name
11
cuonglm

オプションの終わりをマークするには、ダブル--を使用します。

cat -- -<FILENAME>

touchrmgit 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

警告:スクリプトでは、常に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
23

代替案は奇妙になります:

dd if=-x 2>/dev/null
2
Walter A