Яка різниця у використанні "сенсорного файлу" та "> файла" для створення нового файлу?


13

Я новачок у Linux. Коли я створюю новий файл .gitignore в поточному каталозі за допомогою bash, я виявив, що можу:

> .gitignore

або

touch .gitignore

Здається, вони роблять те саме. Коли я перевіряю посібник на touch, він говорить про зміну часової позначки для поточного файлу, але посібника для цього немає >. То чи може хтось пояснити, що можна >зробити і чи є різниця у використанні цих двох команд у цьому контексті? Спасибі.


1
Мені цікаво, де ви навчилися використовувати ">" як генератор файлів, не вивчаючи його призначення
forresthopkinsa

1
Ви знайдете перенаправлення, задокументовані в посібнику Bash. У командному рядку введіть команду man bash. Це довгий документ, і на його розуміння знадобляться дні чи навіть тижні, але все-таки варто пройти, якщо ви хочете досконало вивчити Баша.
Падді Ландау

Відповіді:


21

>є оператором перенаправлення оболонки. Див. Яка різниця між ">" та ">>" в командній оболонці? і Коли я повинен використовувати <або <() або << і> або> ()? В основному використовується для перенаправлення виводу команди у файл. Якщо файл не існує, оболонка створює його. Якщо вона існує, оболонка обрізає її (спорожнює). З просто > fileкомандою немає, тому оболонка створює файл, але вихід не надсилається до нього, тому чистим ефектом є створення порожнього файлу або випорожнення існуючого файлу.

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

Поведінка >залежить від оболонки. У баші, тире та більшості снарядів > fooпрацюватимуть, як ви очікуєте. У програмі zsh за замовчуванням > fooпрацює як cat > foo- zsh чекає на введення вводу.


10
Ключовим моментом тут є те , що немає практичної різниці між >> fileі , touch fileале , якщо fileне існує, є велика різниця між ними обома і > file(в тому , що попередній вміст fileвтрачається). Це, плюс непослідовна поведінка zsh засобів, touch fileє "найбезпечнішим", і тому його слід запам'ятовувати як "Правильний спосіб зробити це".
Monty Harder

1

Ось цікаве порівняння:

$ cat redirect.sh touch.sh sed.sh awk.sh cp.sh truncate.sh tee.sh vi.sh
> redirect.txt
touch touch.txt
sed 'w sed.txt' /dev/null
awk 'BEGIN {printf > "awk.txt"}'
cp /dev/null cp.txt
truncate -s0 truncate.txt
tee tee.txt </dev/null
vi -esc 'wq vi.txt'

Результат:

$ strace dash redirect.sh | wc -l
387

$ strace dash touch.sh | wc -l
667

$ strace dash sed.sh | wc -l
698

$ strace dash awk.sh | wc -l
714

$ strace dash cp.sh | wc -l
786

$ strace dash truncate.sh | wc -l
1004

$ strace dash tee.sh | wc -l
1103

$ strace dash vi.sh | wc -l
1472

1
Хоча порівняння може бути цікавим, я дійсно не бачу того, що ви хочете, щоб я бачив тут. Чи можете ви пояснити, що ви збираєтесь? Я думаю, що це різні способи запису матеріалів у файли, але я вважаю це трохи заплутаним, як це. Можливо, це мій брак кави.
m00am

@ m00am, що показано тут - це 8 різних способів створення файлу. straceповинен показати системні виклики, які виконуються, а > file.txtметод показаний як мінімум виконаних системних викликів, що насправді не все дивно - чим складніший інструмент, тим складніші його системні виклики. Проблема із наведеними прикладами, однак, полягає в тому, що він straceпише stderrпотік за замовчуванням, і у цій відповіді Стівен використовує трубу лише для читання stderr, тому я трохи збентежений, як він рахував лінії за допомогою |труби, а не|&
Сергій Колодяжний

І на Ubuntu 16.04, використовуючи |&, як згадує @Serg, я зараховую приблизно п'яту частину цих тут ... крім viвипадку, коли я отримую приблизно те саме значення
muru

WSL? Вау ... Я не думав, що WSL додасть, що багато системних дзвінків за те, що він робить.
муру

@muru Cygwin - WSL ще не готовий stackoverflow.com/a/40370009
Стівен Пенні
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.