Чи може хтось пояснити мені різницю між командами оболонки >
та >>
при використанні цих команд?
Приклад:
ps -aux > log
ps -aux >> log
Здається, результат однаковий і в будь-якому випадку.
Чи може хтось пояснити мені різницю між командами оболонки >
та >>
при використанні цих команд?
Приклад:
ps -aux > log
ps -aux >> log
Здається, результат однаковий і в будь-якому випадку.
Відповіді:
>
використовується для перезапису (" clobber ") файлу і >>
використовується для додавання до файлу.
Таким чином, коли ви використовуєте ps aux > file
, вихідний файл ps aux
буде записаний у file
файл, і якщо ім'я файлу file
вже присутнє, його вміст буде перезаписано.
І якщо ви використовуєте ps aux >> file
, вихідний файл ps aux
буде записаний у, file
і якщо названий файл file
вже був присутній, файл тепер буде містити його попередній вміст, а також вміст ps aux
, написаний після його старого вмісту file
.
Найважливіша відмінність полягає в тому, що >
змушує оболонку відкривати файл або подібний до файлу об’єкт із 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) команди, і це буде успадковано будь-якою командою оболонки оболонки.