Не мог бы кто-нибудь объяснить мне разницу между >
и >>
при использовании команд оболочки?
Пример:
ps -aux > logps -aux >> log
Похоже, результат в любом случае один и тот же.
Не мог бы кто-нибудь объяснить мне разницу между >
и >>
при использовании команд оболочки?
Пример:
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?