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