Чому не існує команди оболонки для створення файлів?


27

Увага будь-ласка:

Я не запитую, як зробити файл з командного рядка!


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

touch foo.bar
> foo.bar
cat > foo.bar
echo -n > foo.bar
printf '' > foo.bar

І я впевнений, що є більше.

Але справа в тому, що жодна з наведених вище команд насправді не призначена для створення файлів. Наприклад, man touchприпускає, що ця команда призначена для зміни часових міток файлів. Чому ОС, настільки повна, як Unix (або Linux), не має команди, призначеної виключно для створення файлів?


35
Чому б ви захаращували систему, щоб додати команду, щоб зробити щось, що можна зробити з десяток способів за допомогою інструментів, які вже є?
Майкл Коне

4
Чому немає команди для читання файлів з / в потоки / stdin / out? Усі користуються командою, призначеною для catутвердження!
СФ.

2
@MichaelKohne, я бачу вашу думку, з усією повагою, у мене з цим проблема. При такому підході існує багато команд, які лише захаращують систему. Навіщо використовувати, moreколи lessробить більше, ніж те, що moreроблять !? Або dirі ls. Хоча мені відомо про проблеми сумісності.
Пуя

9
moreпередує створенню less. lessстворено спеціально для усунення недоліків more. moreвсе ще існує з відсталих причин сумісності. dirі lsдля більшості намірів і цілей однакові виконувані файли - вони відрізняються лише кількома байтами. Новий інструмент , призначений спеціально для створення файлів буде робити менше , ніж існуючі інструменти, і, таким чином, було б регрес, а не поліпшення , як і в випадку lessпроти more.
lanzz

1
Крім того, нам потрібно подивитися на спадщину, Unix був створений при підрахунку кожного байту. Навіщо створювати утиліту для завдання, яке можна виконати з уже наявною утилітою?
Томас

Відповіді:


38

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

Немає ніякої користі спочатку створити файл, а потім скористатися перенаправленням вводу-виводу, щоб записати у файл, якщо це можна зробити за один крок.

У тих випадках, коли ви дійсно хочете створити порожній файл і залишити його, я стверджую, що > "${file}"це не може бути більш коротким і елегантним.

TL; DR : Він не існує, оскільки для створення порожніх файлів найчастіше немає користі, а у випадках, коли вони є, існує безліч варіантів для досягнення цієї мети.

З іншого боку, використання touchфайлу працює лише тоді, коли файл не існує, тоді як параметри, що використовують перенаправлення, завжди будуть усікати файл, навіть якщо він існує (технічно ці рішення не є тотожними). > fooє кращим методом, оскільки він економить forkі echo -nслід уникати його загалом, оскільки це дуже нерепортажно.


1
Я зрозумів, що ви створили файл, а потім використовували інструменти вводу / виводу, дуже міцні. Дякую.
Пуя

1
@FaheemMitha Так ( >>). Я мав на увазі приклади, надані ОП з використанням >. Додавання було б зовсім марним, якщо ви хочете створювати файли (або NOOP, якщо вони існують).
Адріан Фрюхвітрт

1
Не забувайте, що noclobberце не повинно бути встановлено таким чином, щоб >перезаписати наявний файл.
Оукі

1
@Ouki AFAIK, встановивши, що це не типова поведінка, і можна забути, що вона встановлена ​​в одній системі, а не в іншій, що потенційно може призвести до проблем так само, як створення alias rm='rm -i'замість цього alias rmi='rm -i'- погана ідея.
Agi Hammerthief

1
@mikeserv, > .fileлише в командному рядку, це зробить це прекрасно без :.
Чарльз Даффі

16

Відповідь Адріана Фрюхвірта правильна. Я просто хотів би додати , що є на самому ділі команда спеціально написано для створення файлів: mktemp.

NAME
       mktemp - create a temporary file or directory

SYNOPSIS
       mktemp [OPTION]... [TEMPLATE]

DESCRIPTION
       Create a temporary file or directory, safely, and print its name.  TEM
       PLATE must contain at least 3 consecutive 'X's in last  component.   If
       TEMPLATE is not specified, use tmp.XXXXXXXXXX, and --tmpdir is implied.
       Files are created u+rw, and directories  u+rwx,  minus  umask  restric
       tions.

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

Однак, у вас є truncateі fallocateобидва, основна мета яких - створити файли. Вони просто мають більш складний підхід. Ніколи не буде простої програми, яка робить те, що > fileробить, оскільки немає способу, як це було б краще, ніж > file.


11

Більшість основних інструментів для оболонки взагалі не розроблені для будь-яких дуже конкретних цілей. Більшість основних інструментів для оболонок призначені лише для взаємодії з іншими для досягнення вашої мети. Або, можливо, слід сказати, що більшість інструментів роблять лише одну дуже основну річ, незалежно від того, як вони можуть бути поєднані для досягнення мети.

: >./file

Це створює порожній файл. Або обрізає наявний файл, як ви хочете. Ти можеш:

set -o noclobber

щоб уникнути будь-якої можливості останнього випадку, якщо ви не:

: >|./file

Ви можете отримати подібну поведінку до touch:

: >>./file
: >>|./file

За винятком того, що :оновлення файлу не буде оновлено, оскільки він не змінений.

DEMO

mkdir test ; cd $_
touch touch.file 
: >null.file
echo >echo.file
ls -l

ВИХІД

-rw-r--r-- 1 mikeserv mikeserv 1 Apr 10 14:52 echo.file
-rw-r--r-- 1 mikeserv mikeserv 0 Apr 10 14:52 null.file
-rw-r--r-- 1 mikeserv mikeserv 0 Apr 10 14:52 touch.file

НЕ ТУЧАЙТЕ

: >>|./echo.file
ls -l 

ВИХІД

-rw-r--r-- 1 mikeserv mikeserv 1 Apr 10 14:52 echo.file
-rw-r--r-- 1 mikeserv mikeserv 0 Apr 10 14:52 null.file
-rw-r--r-- 1 mikeserv mikeserv 0 Apr 10 14:52 touch.file

За замовчуванням ехо додається \nв кінці рядка. Спробуйте echo -n >echo-n.file(size = 0) та echo -e >echo-e.file(size = 1)
Томас

@Thomas 'Рядок, який потрібно записати на стандартний вихід. Якщо перший операнд - -n, або якщо будь-який з операндів містить символ зворотної косої риси ('\'), результати визначаються реалізацією. У системах, що відповідають XSI, якщо перший операнд дорівнює -n, він повинен розглядатися як рядок, а не як варіант. Наступні послідовності символів повинні бути розпізнані в системах, що відповідають XSI, в межах будь-якого аргументу ... ' pubs.opengroup.org/onlinepubs/009604599/utilities/echo.html
mikeserv

Досить справедливо, дякую за посилання, і мій коментар все одно не суть
Thomas

2
Так і вибачте, я мав на увазі, що в моєму коментарі все одно пропущено пункт вашої відповіді, вибачте з цього приводу.
Томас

1
Ілюстрацією тенденції до узагальнення Unix є той факт, що викликається команда для відображення вмісту файлу cat. Чому має команда відображати один файл, коли ви могли скласти одну команду для об'єднання декількох файлів у стандартний вихід?
200_успіх

1

Утиліта installфактично призначена для створення файлів! Ви можете передати вміст файлу через /dev/stdin(в більшості випадків, однак, для більшості ароматів Linux, для цього потрібно /procвстановити) або надати інший вихідний файл. Ви можете встановити право власності та дозволи.

echo "New file" | install -o 0644 -m 452452 -g dumbass /dev/stdin /var/www/index.html

як дурний приклад.

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