Мені було цікаво, як зробити файл, названий як прапор, наприклад, якщо я хотів би створити папку з назвою -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 *
.
--
його розуміють не всі команди, лише кілька)
--
це штучка, тому вона повинна працювати для всіх програм?
Причина , чому mkdir '-a'
, або mkdir \-a
не працює тому , що обидва цих методу (використовуючи лапки або слеш) використовуються для запобігання пошкодження оболонки (ймовірно bash
) від надання їм будь - яких особливий сенс. Оскільки так -a
само не означає нічого особливого для оболонки, вони не впливають на те, як вона передається mkdir
.
Що mkdir
стосується цього, він отримує список аргументів із оболонки, і він не може сказати, вводили ви їх у лапки чи ні, чи відбувся зворотний проріз. Він просто бачить один аргумент -a
. Ось чому вам потрібно те --
, що пояснено в інших відповідях.
На додаток до відповіді "slhck" є ще одна хитрість, яка іноді спрацьовує:
Розмістіть назву файлу в межах 2 наборів (різних) qoutes, як "'-a'"
або '"-a"'
.
Від того, чи це працює, залежить від програми, але це в крайньому випадку, якщо програма не підтримує функцію POSIX --
.
Метод POSIX завжди є кращим, оскільки він на 100% надійний.
--
для завершення обробки параметрів також передбачає, що вам не потрібно жодних параметрів для слідування імені файлу, що не завжди так.
'-a'
або "-a"
, принаймні, у системах типу BSD