Мне было интересно, как сделать файл с именем флага, например, если бы я хотел сделать папку с именем -a, какие команды добились бы цели?
Я пытался mkdir '-a', mkdir \-aи ни один не работал. Я на Ubuntu.
Мне было интересно, как сделать файл с именем флага, например, если бы я хотел сделать папку с именем -a, какие команды добились бы цели?
Я пытался mkdir '-a', mkdir \-aи ни один не работал. Я на Ubuntu.
Ответы:
Вызовите команду так:
mkdir -- -a
Это --означает, что после этого опции заканчиваются, поэтому -aинтерпретация интерпретируется буквально, а не как опция mkdir. Этот синтаксис вы найдете не только в mkdirлюбой POSIX-совместимой утилите, но echoи в test. Из спецификации :
Аргумент - должен быть принят в качестве разделителя, указывающего конец опций. Любые последующие аргументы должны рассматриваться как операнды, даже если они начинаются с символа «-». Аргумент - не должен использоваться как опция или как операнд.
Использование --в качестве меры безопасности рекомендуется практически для любого действия, когда вы имеете дело с именами файлов и хотите убедиться, что они не нарушают команду, например, при перемещении файлов в цикле вы можете вызвать следующее, чтобы файл с именем -iisn ' 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