Мне было интересно, как сделать файл с именем флага, например, если бы я хотел сделать папку с именем -a
, какие команды добились бы цели?
Я пытался mkdir '-a'
, mkdir \-a
и ни один не работал. Я на Ubuntu.
Мне было интересно, как сделать файл с именем флага, например, если бы я хотел сделать папку с именем -a
, какие команды добились бы цели?
Я пытался mkdir '-a'
, mkdir \-a
и ни один не работал. Я на Ubuntu.
Ответы:
Вызовите команду так:
mkdir -- -a
Это --
означает, что после этого опции заканчиваются, поэтому -a
интерпретация интерпретируется буквально, а не как опция mkdir
. Этот синтаксис вы найдете не только в mkdir
любой POSIX-совместимой утилите, но echo
и в test
. Из спецификации :
Аргумент - должен быть принят в качестве разделителя, указывающего конец опций. Любые последующие аргументы должны рассматриваться как операнды, даже если они начинаются с символа «-». Аргумент - не должен использоваться как опция или как операнд.
Использование --
в качестве меры безопасности рекомендуется практически для любого действия, когда вы имеете дело с именами файлов и хотите убедиться, что они не нарушают команду, например, при перемещении файлов в цикле вы можете вызвать следующее, чтобы файл с именем -i
isn ' t (in?) правильно анализируется как опция:
mv -- "$f" new-"$f"
cc -o -myfile -Wall -myfile.c
бы немного надуманный пример. Любой полезный редактор должен иметь возможность сохранить файл с именем, -myfile.c
если вы его об этом попросите, но компилятор C, вероятно, не будет делать то, что вы хотите, если ему будет предоставлен такой список опций.
cc
команда, приведенная выше Майклом, в которой есть -o
возможность указать выходной файл.
for f in ./*; do...
а неfor f in *; do...
Самый простой способ работы с любой приемлемой программой - использовать относительный путь перед именем -
, например mkdir ./-a
, создаст каталог с именем -a
в текущем рабочем каталоге.
Наиболее распространенный пример использования этого «трюка» - это когда вы хотите удалить файл, который начинается с тире, так что вы можете это сделать rm ./-a
.
./
всегда хорошая идея - представьте, что вы создали файл с именем, -rf
а затем вы вызвали rm *
.
--
не понятен каждой команде, только немногие)
--
это вещь bash, так что она должна работать для всех программ?
Причина, почему mkdir '-a'
илиmkdir \-a
не работает, заключается в том, что оба эти метода (с использованием кавычек или обратной косой черты) используются для предотвращения придания вашей оболочке (вероятно bash
) какого-либо особого значения. Так -a
как в любом случае для оболочки ничего особенного не значит, это никак не влияет на то, как она передается mkdir
.
Что mkdir
касается этого, он получает список аргументов от оболочки и не может сказать, помещены ли они в кавычки или нет, или был ли обратный слеш. Просто видит один аргумент -a
. Вот почему вам нужно--
как описано в других ответах.
В дополнение к ответу от «slhck» есть еще одна хитрость, которая иногда работает:
Поместите имя файла в 2 набора (разных) qoutes, как "'-a'"
или '"-a"'
.
Работает это или нет, зависит от программы, но это последнее средство, если программа не поддерживает --
функцию POSIX .
Метод POSIX всегда предпочтителен, поскольку он надежен на 100%.
--
для прекращения обработки опций также предполагает, что вам не нужны никакие опции для следования имени файла, что не всегда так.
'-a'
or "-a"
, по крайней мере, в системах типа BSD