Как использовать имена файлов, начинающиеся с тире & ldquo; - & rdquo; в качестве аргументов команды?

Это может быть простой вопрос, но как мне использовать файлы, начинающиеся с «-», с программами командной строки?

Например, я пытаюсь использовать pdfgrep для файла с именем -2013-01-01.pdf, но он жалуется, что нет опций, определенных для 2, 0, 1, 3 и т. Д.

Изменение имени файла на что-то, что не начинается с «-», решает его, но это не вариант, так как файлы не созданы мной. Я просто хочу проверить, есть ли конкретные изменения, которые, как я знаю, произойдут.

20
задан 16 February 2017 в 05:45

2 ответа

Очень часто -- используется на командной строке, чтобы предупредить программу, что никакие более доступные командные коммутаторы не будут используемыми. Это особенно полезно, если бы файл содержит тире, которого программа попыталась бы интерпретировать как опция.

  1. Без --, существует сгенерированная ошибка:

    $ pdfgrep -i posix -find.pdf -xorg.pdf
    
    pdfgrep: invalid option -- 'f'
    pdfgrep: invalid option -- 'd'
    pdfgrep: invalid option -- '.'
    pdfgrep: invalid option -- 'p'
    pdfgrep: invalid option -- 'd'
    pdfgrep: invalid option -- 'f'
    
  2. С -- используемый у нас есть успешная команда:

    $ pdfgrep -i posix -- -find.pdf -xorg.pdf
    
    -find.pdf: on the command line. Currently-implemented types are emacs (this is the default), posix-awk,
    -find.pdf: posix-basic, posix-egrep and posix-extended.
    -find.pdf: posix-basic, posix-egrep and posix-extended.
    -find.pdf: posix-basic, posix-egrep and posix-extended.
    
  3. pdfgrep программируется для понимания -- означать, что следующие параметры командной строки не являются опциями. Большинство программ делает то же, но не все программы понимают --. Для программ, которые не делают, решение состоит в том, чтобы предварительно ожидать имя файла с ./, как это:

     pdfgrep -i posix ./-find.pdf ./-xorg.pdf
    

    Это должно работать с любой командой, если по некоторым причинам команда не может принять путь, только чистое имя файла.

Для общего введения в командную строку посмотрите этот полезный PDF.

22
ответ дан 16 February 2017 в 05:45

Вы добавляете имя файла с ./ (или другим подходящим относительным или абсолютным путем). Таким образом, это портативно.

Пример:

for zefile in ./*.tmp
do
   rm -f "$zefile"
done

Использование -- для указания конца опций не всегда доступно. Некоторые команды будут знать это, некоторые - нет. И это изменится в разных системах. Так что, в конце концов, он менее портативный.

0
ответ дан 16 February 2017 в 05:45

Другие вопросы по тегам:

Похожие вопросы: