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

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

Пример:

ps -aux > logps -aux >> log

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

> используется для перезаписи (“грохот”) файл и >> используется для добавления в файл.

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

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

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

ps aux > log

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

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

ps aux >> log

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

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

ps -aux > log

это то же самое, что и

rm log 2>/dev/nullps -aux >> log

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

Самое важное отличие заключается в том, что > заставляет оболочку открывать файл или файлоподобный объект с помощью 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) = 3dup2(3, 1)                              = 1dup2(10, 1)                             = 1

И с

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

Обратите внимание, что в обоих случаях файловый дескриптор открытого файла дублируется в файловый дескриптор 1 ( stdout ) команды, и он будет унаследован любой командой, которую разветвляет оболочка.

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