В чем разница между «>» и «>>» в команде оболочки?

45

Может ли кто-нибудь объяснить мне разницу между >и >>при использовании команд оболочки?

Пример:

ps -aux > log
ps -aux >> log

Кажется, результат одинаков в любом случае.

whale_steward
источник
2
Для получения дополнительной информации о некоторых из операторов bash, обратитесь также к разделу Какая разница между <<, <<< и <<в bash?
Сергей Колодяжный,

Ответы:

48

>используется для перезаписи (« clobber ») файла и >>используется для добавления в файл.

Таким образом, когда вы используете ps aux > file, вывод ps auxбудет записан, fileа если файл с именем fileуже присутствовал, его содержимое будет перезаписано.

И если вы используете ps aux >> file, вывод ps auxбудет записан, fileи если названный файл fileуже присутствовал, файл теперь будет содержать его предыдущее содержимое, а также содержимое ps aux, записанное после его более старого содержимого file.

Jobin
источник
11

если ты пишешь в терминал

ps aux > log

Это поместит вывод ps auxв лог именованного файла.

тогда если вы положите

ps aux >> log

тогда следующий вывод будет добавлен ниже первого. если вы установите только один, >он заменит предыдущий файл.

souravc
источник
4

Да, >>добавляет, >всегда перезаписывает / уничтожает предыдущий контент.

ps -aux > log

такой же как

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

На Wintel это то же самое .bat, что .cmdи для .ps1скриптов; общее наследие, здравый смысл.

mckenzm
источник
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) команды, и он будет наследоваться любой командой, которую разветвляет оболочка.

Сергей Колодяжный
источник