Використовуйте подвійний, --
щоб позначити кінець опцій:
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
./
префікс. Це найпортативніший (див. Поширені питання про Unix епохи Usenet)