Apa perbedaan antara ">" dan ">>" dalam perintah shell?

45

Bisakah seseorang menjelaskan kepada saya perbedaan antara >dan >>ketika menggunakan perintah shell?

Contoh:

ps -aux > log
ps -aux >> log

Sepertinya hasilnya sama saja.

whale_steward
sumber
2
Untuk info tambahan tentang beberapa operator bash, lihat juga Apa perbedaan antara <<, <<< dan <<dalam bash?
Sergiy Kolodyazhnyy

Jawaban:

48

>digunakan untuk menimpa (" clobber ") file dan >>digunakan untuk menambahkan file.

Dengan demikian, ketika Anda menggunakan ps aux > file, output dari ps auxakan ditulis ke filedan jika file bernama filesudah ada, isinya akan ditimpa.

Dan jika Anda menggunakan ps aux >> file, output dari ps auxakan ditulis ke filedan jika file bernama filesudah ada, file sekarang akan berisi konten sebelumnya dan juga isi ps aux, ditulis setelah konten yang lebih lama dari file.

pekerjaan
sumber
11

jika Anda menulis di terminal

ps aux > log

Ini akan menempatkan output ps auxke file bernama log.

maka jika Anda menempatkan

ps aux >> log

maka output selanjutnya akan ditambahkan di bawah yang pertama. jika Anda hanya meletakkan satu >file itu akan menimpa file sebelumnya.

souravc
sumber
4

Ya, >>tambahkan, >selalu menimpa / menghancurkan konten sebelumnya.

ps -aux > log

sama dengan

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

Di Wintel itu sama untuk .bat, .cmddan .ps1naskah juga; warisan bersama, akal sehat.

mckenzm
sumber
3

Perbedaan paling penting adalah >membuat shell membuka file atau objek seperti file dengan O_WRONLY|O_CREAT|O_TRUNCflag - file akan dibuat atau terpotong jika ada, sementara >>file dibuka dengan O_WRONLY|O_CREAT|O_APPENDflag - file akan dibuat atau ditambahkan jika ada. Ini terbukti jika Anda melacak panggilan sistem, misalnya dengan

$ 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

Dan dengan

$ 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 +++

Perhatikan bahwa dalam kedua kasus, deskriptor file dari file terbuka digandakan ke file descriptor 1 (stdout) dari perintah, dan itu akan diwarisi oleh perintah apa pun yang di-shell shell.

Sergiy Kolodyazhnyy
sumber