Мне было интересно, как создать файл с именем флага, например, если я хочу создать папку с именем -a
, какие команды помогут?
Я пробовал mkdir '-a'
, mkdir \-a
, и ни один из них не работал. Я нахожусь на Ubuntu.
Мне было интересно, как создать файл с именем флага, например, если я хочу создать папку с именем -a
, какие команды помогут?
Я пробовал mkdir '-a'
, mkdir \-a
, и ни один из них не работал. Я нахожусь на Ubuntu.
Вызовите команду так:
mkdir -- -a
Параметр --
означает, что после этого опции заканчиваются, поэтому -a
интерпретируется буквально, а не как опция для mkdir
. Вы найдете этот синтаксис не только в mkdir
, но и в любой POSIX-совместимой утилите, кроме echo
и test
. Из спецификации:
Аргумент - должен быть принят в качестве разделителя, указывающего конец опций. Любые последующие аргументы должны рассматриваться как операнды, даже если они начинаются с символа «-». Аргумент - не должен использоваться как опция или как операнд.
Использование --
в качестве гарантии рекомендуется почти для любого действия, когда вы имеете дело с именами файлов и хотите убедиться, что они не нарушают команду, например, при перемещении файлов в цикле вы можете вызвать следующее, чтобы файл с именем -i
не (в?)правильно разбирается как опция:
mv -- "$f" new-"$f"
Самый простой способ работы с любой приемлемой программой - использовать относительный путь перед -
, например, mkdir ./-a
, создаст каталог с именем -a
в текущем рабочем каталоге.
Наиболее распространенный пример использования этого "трюка" - это когда вы хотите удалить файл, который начинается с тире, поэтому вы можете выполнить rm ./-a
.
Причина, по которой mkdir '-a'
или mkdir \-a
не работает, заключается в том, что оба эти метода (с использованием кавычек или обратной косой черты) используются для предотвращения того, чтобы ваша оболочка (вероятно, bash
) придала им какое-либо особое значение. Так как -a
не имеет ничего общего с оболочкой, это никак не влияет на то, как она передается в mkdir
.
Что касается mkdir
, он получает список аргументов из оболочки и не может определить, помещены ли они в кавычки или нет, или был ли обратный слеш. Он видит только один аргумент -a
. Вот почему вам нужно --
как объяснено в других ответах.
В дополнение к ответу от "slhck" есть еще одна хитрость, которая иногда работает:
Поместите имя файла в 2 набора (разных) qoutes, таких как "'-a'"
или '"-a"'
.
Является ли это работает , зависит от программы, но это в крайнем случае, если программа не поддерживает POSIX --
функцию.
Метод POSIX всегда предпочтителен, поскольку он надежен на 100%.