Для чого використовується опція -f для `touch`?


23

Від man touch:

-f     (ignored)

Але я не розумію, що розуміється під ігноруванням .

Я спробував наступне:

$ ls -l file
-rw-rw-r-- 1 pandya pandya 0 Mar 20 16:17 file

$ touch -f file
$ ls -l file
-rw-rw-r-- 1 pandya pandya 0 Mar 20 16:18 file

І помітив, що це змінює часові позначки, незважаючи на -f.

Отже, я хочу знати, що -fозначає, або що це робить.


2
Я припускаю, що -fяк варіант просто ігнорується. Можливо, проаналізували аналізатор аргументів, і все.
Томаса

1
(ігнорується) означає, що прапор ігнорується, а не команда.
Фонд позову Моніки

Відповіді:


47

Повна утиліта GNU знаходиться на infoсторінці, де ви можете прочитати:

-f
Проігноровано; для сумісності з BSD версіями `touch '.

Див історичних сторінок BSD людини за дотик , де повинні -fбуло змусити дотик.

Якщо ви подивитесь на джерело цих старих BSD, utimes()системного виклику не було, тому touchвідкриєте файл у режимі читання + запису, прочитайте один байт, шукайте назад і записуйте його ще раз, щоб оновити останній час доступу та останнього часу модифікації .

Очевидно, що вам потрібні були і права на читання, і на запис ( touchуникнути спроб зробити це, якщо access(W_OK|R_OK)повернеться неправдивим ). -fспробував обійти це, тимчасово змінивши дозволи на 0666 !

0666 означає дозвіл на читання та запис усім. Це повинно бути так, як інакше (як, наприклад, з більш обмежувальним дозволом, таким як 0600, який все-таки дозволив би дотик ), що могло означати під час цього короткого вікна, процеси, які в іншому випадку могли б прочитати чи записати дозвіл у файл, вже не могли , порушуючи функціональність .

Це означає, однак, що процеси, які б інакше не мали доступу до файлу, мають коротку можливість відкрити його, порушуючи безпеку .

Це не дуже розумна справа. Сучасні touchреалізації цього не роблять. З цього часу utime()системний виклик був введений, що дозволяє змінювати модифікації та час доступу окремо, не змішуючись із вмістом файлів (це означає, що він також працює з нестандартними файлами) і для цього потрібен лише доступ для запису.

GNU touchяк і раніше не виходить з ладу, якщо передає -fпараметр, а просто ігнорує прапор. Таким чином, сценарії, написані для тих старих версій BSD, не виходять з ладу при перенесенні в системи GNU. На сьогоднішній день не так вже й актуально.


3
За даними developer.apple.com/library/mac/documentation/Darwin/Reference/…, -f все ще функціонує в Mac OS X. (Але, без сумніву, існує принаймні 57 різних способів виконання тієї ж функціональності "краще", використовуючи графічний інтерфейс! )
alephzero

20
Використання графічного інтерфейсу не обов'язково "краще". Сенс використання сценаріїв полягає в автоматизації матеріалів, що включає забезпечення того, що ваш сценарій працює незмінним на якомога більшій кількості діалектів unixy або, принаймні, на більшості діалектів, з якими ви, мабуть, зіткнетеся, і саме тут ці старі, застарілі проблеми сумісності стають проблемою. .
Гунтрам Блом підтримує Моніку

@alephzero Це тому, що версія в OS X є версією BSD, з якою GNU підтримує сумісність.
Бармар

14

-fнічого не робить. Він зберігається для історичної сумісності ( touchвідповідно до BSD info touch), так що програми, які очікують його існування, не передають його та повертають повідомлення про помилку, вказуючи, що його не існує. Якщо припустити, що це GNU coreutils, ви можете побачити в джерелі, що це просто breakвиходить з перемикача обробки опцій, нічого не роблячи.

Як ігнорований варіант, -fприсутній з першої версії команди GNU, touchдоданої у 1992 році ( див. Розд. ). Здається, що, принаймні, у FreeBSD v9 -f"намагаються [s] змусити оновити, навіть якщо дозволи файлів не дозволяють його наразі" (як виявив Sukminder, спасибі).


2
infoна сторінці написано Проігноровано; для сумісності з BSD версіями `touch '.
heemayl

@heemayl За винятком того, що я не зміг знайти BSD, який, здається, постачається з "-f" аргументом для дотику, тому він повинен бути досить старим.
Кріс Даун

Хм .. Я щойно перевірив посібник з Coreutils , де сказано: "Проігноровано; на сумісність з BSD-версіями touch".
Pandya

3
-fє / використовувався для спроби примусити оновити, навіть якщо дозволи файлів не дозволяли це на BSD. Не у V10, а v9: freebsd.org/cgi/… (принаймні, FreeBSD).
Руніум

@sukminder Туз, спасибі! Я додам вашу інформацію у відповідь.
Кріс Даун

12

Щоразу, коли ви бачите "варіант X ігнорується" у --help-виведенні або на сторінці, це означає: програма приймає варіант X - ви не отримуєте синтаксичну помилку - але це не робить ніякого ефекту. Програма робить те саме, що було б зроблено за відсутності можливості.

Як показують інші відповіді, це робиться для зворотної сумісності. Варіант, який використовувався для того, щоб мати певний ефект, усе, що він робив, більше не корисний, і робити те саме, що незалежно від варіанта, є правильною поведінкою сумісності.


0

Дивлячись на коментар в історичному вихідному коді , рядок 22:

  22   -f                     (ignored)\n\

Параметр -f мав бути ігнорований з моменту початкового випуску Джимом Мейрінг.

І оператор переключення для обробки параметрів має явний випадок (рядки 150/151), щоб нічого не робити:

 150         case 'f':
 151           break;

Чудово, що мотивувало наступних авторів починаючи з 1992 року, щоб ігнорувати цей варіант. Можливо, є сценарій використання, який вимагає опції -f і в іншому випадку перерви?

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.