./
で区切る以外に、ターミナルからダッシュファイルを読み取るにはどうすればよいですか
たとえば、- file
を読み取るには、
cat ./-file_name
Q:同じことを達成する別の方法はありますか?
Stdinから入力を取得するコマンドの場合、リダイレクトを使用できます。
cat <-file_name
オプションの終わりをマークするには、ダブル--
を使用します。
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
警告:スクリプトでは、常に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
代替案は奇妙になります:
dd if=-x 2>/dev/null