Яка різниця між ">" та ">>" у командній оболонці?


45

Чи може хтось пояснити мені різницю між командами оболонки >та >>при використанні цих команд?

Приклад:

ps -aux > log
ps -aux >> log

Здається, результат однаковий і в будь-якому випадку.


2
Для отримання додаткової інформації про деякі оператори bash, також зверніться до розділу Яка різниця між <<, <<< та <<у bash?
Сергій Колодяжний

Відповіді:


48

>використовується для перезапису (" clobber ") файлу і >>використовується для додавання до файлу.

Таким чином, коли ви використовуєте ps aux > file, вихідний файл ps auxбуде записаний у fileфайл, і якщо ім'я файлу fileвже присутнє, його вміст буде перезаписано.

І якщо ви використовуєте ps aux >> file, вихідний файл ps auxбуде записаний у, fileі якщо названий файл fileвже був присутній, файл тепер буде містити його попередній вміст, а також вміст ps aux, написаний після його старого вмісту file.


11

якщо ви пишете в терміналі

ps aux > log

Він помістить вихід у ps auxжурнал, названий файлом.

то якщо ви покладете

ps aux >> log

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


4

Так, >>додає, >завжди перезаписує / знищує попередній вміст.

ps -aux > log

те саме, що

rm log 2>/dev/null
ps -aux >> log

У Wintel це те саме .bat, що .cmdі у .ps1сценаріїв; спільна спадщина, здоровий глузд.


3

Найважливіша відмінність полягає в тому, що >змушує оболонку відкривати файл або подібний до файлу об’єкт із O_WRONLY|O_CREAT|O_TRUNCпрапорами - файл буде створений або усічений, якщо він існує, тоді як >>відкриває файл із O_WRONLY|O_CREAT|O_APPENDпрапорами - файл буде створений або доданий до нього, якщо він існує. Це очевидно, якщо ви відстежуєте системні виклики, наприклад, за допомогою

$ strace -e open,dup2 bash -c 'true >> /dev/null'
...
open("/dev/null", O_WRONLY|O_CREAT|O_APPEND, 0666) = 3
dup2(3, 1)                              = 1
dup2(10, 1)                             = 1

І с

$ strace -e open,dup2 bash -c 'true > /dev/null'
...
open("/dev/null", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
dup2(3, 1)                              = 1
dup2(10, 1)                             = 1
+++ exited with 0 +++

Зауважте, що в обох випадках дескриптор відкритого файлу дублюється на дескриптор файлу 1 (stdout) команди, і це буде успадковано будь-якою командою оболонки оболонки.

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