Мне было интересно, как создать файл с именем флага, например, если я хочу создать папку с именем -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%.