Saat membuat file kosong, mengapa orang lebih suka 'menyentuh file' di atas ': >> file'?

33

Tidak pernah menyadari bahwa Anda bisa melakukan ini sampai sekarang:

: >> file

Secara fungsional tampaknya mirip dengan:

touch file

Apakah ada alasan mengapa sebagian besar sumber daya tampaknya lebih suka menyentuh shell builtin ini?

Harold Fischer
sumber
7
Bentuk pendek mungkin terkait shell, sedangkan sentuhan adalah perintah mandiri. Oleh karena itu formulir singkat tergantung pada shell yang Anda gunakan (dan orang-orang memang memiliki preferensi kuat di bidang ini) karena mungkin tidak semuanya menyediakan jalan pintas. touchmenjadi mandiri akan bekerja dengan cara yang sama apa pun yang harus Anda gunakan.
Patrick Mevzek
3
Terkait Apa perbedaan antara file sentuh dan file pada AU.
αғsнιη
6
Contoh pertama harus diedit : >> fileatau bahkan >> file, sehingga mereka memiliki efek yang sama, yaitu TIDAK merusak konten file.
user000001
2
touchterutama memperbarui mtime. Itu tidak mengosongkan file yang ada tidak seperti >.
rexkogitans
2
Tidak ada perintah "membuat file kosong"; mereka hanya memiliki hasil ini jika file tersebut belum ada. Untuk menjamin file kosong, Anda perlu > file.
alexis

Jawaban:

47

Anda bahkan tidak perlu menggunakan :; Anda bisa > file(setidaknya di bash; shell lain mungkin berperilaku berbeda).

Dalam istilah praktis, tidak ada perbedaan nyata di sini (meskipun overhead dari memanggil /bin/touchadalah sesuatu).

touchNamun, juga dapat digunakan untuk memodifikasi cap waktu pada file yang sudah ada tanpa mengubah atau menghapus konten; selanjutnya, > fileakan meniup apa saja fileyang sudah ada. Ini bisa diselesaikan dengan menggunakan >> file.

Satu perbedaan lainnya touchadalah Anda dapat membuatnya (atau memperbarui cap waktu) beberapa file sekaligus (misalnya touch foo bar baz quux) dengan sintaksis yang lebih ringkas daripada dengan pengalihan, di mana setiap file memerlukan pengalihan sendiri (mis >foo >bar >baz >quux.).

Menggunakan touch:

$ touch foo; stat -x foo; sleep 2; touch foo; stat -x foo
  File: "foo"
  Size: 0            FileType: Regular File
  Mode: (0644/-rw-r--r--)         Uid: (991148597/redacted)  Gid: (1640268302/redacted)
Device: 1,5   Inode: 8597208698    Links: 1
Access: Fri May 25 10:55:19 2018
Modify: Fri May 25 10:55:19 2018
Change: Fri May 25 10:55:19 2018
  File: "foo"
  Size: 0            FileType: Regular File
  Mode: (0644/-rw-r--r--)         Uid: (991148597/redacted)  Gid: (1640268302/redacted)
Device: 1,5   Inode: 8597208698    Links: 1
Access: Fri May 25 10:55:21 2018
Modify: Fri May 25 10:55:21 2018
Change: Fri May 25 10:55:21 2018

Menggunakan pengalihan:

$ > foo; stat -x foo; sleep 2; >> foo; stat -x foo
  File: "foo"
  Size: 0            FileType: Regular File
  Mode: (0644/-rw-r--r--)         Uid: (991148597/redacted)  Gid: (1640268302/redacted)
Device: 1,5   Inode: 8597208698    Links: 1
Access: Fri May 25 10:55:21 2018
Modify: Fri May 25 10:56:25 2018
Change: Fri May 25 10:56:25 2018
  File: "foo"
  Size: 0            FileType: Regular File
  Mode: (0644/-rw-r--r--)         Uid: (991148597/redacted)  Gid: (1640268302/redacted)
Device: 1,5   Inode: 8597208698    Links: 1
Access: Fri May 25 10:55:21 2018
Modify: Fri May 25 10:56:25 2018
Change: Fri May 25 10:56:25 2018
DopeGhoti
sumber
6
Sepertinya >> filetidak akan memperbarui waktu modifikasi. Bukan apa yang dicari OP tetapi hanya ingin menunjukkan itu sepertinya bukan alternatif yang lengkap untuk disentuh.
Jesse_b
2
Karena pertanyaan tidak menentukan shell tertentu. Mungkin baik untuk menunjukkan bahwa > filedalam zsh sama dengan cat > file, tidak : > file.
JoL
Juga, tcsh memungkinkan : > file, tetapi salah > file. Mungkin kesetaraan > fileuntuk : > fileterbatas pada bourne shell and bash?
JoL
+1 untuk ketelitian, namun perhatikan bahwa pada beberapa shell utama (saya bahkan akan menebak semua atau sebagian shell karena implementasi paling sederhana secara alami akan menyebabkan ini berfungsi sebagai efek samping), Anda dapat menyentuh beberapa file menggunakan pengalihan shell: : >foo >baratau : >>foo >>barakan sentuh keduanya foodan bar.
mtraceur
Hanya menjadi bertele-tele karena konteks pertanyaan aktual di sini, tetapi : >foo >bartidak akan touchfile; itu akan mengarahkan (null) output : ke dalam file. touchakan menyentuh file. (:
DopeGhoti
32

Karena Anda dapat touchbeberapa file sekaligus tanpa mengetik karakter khusus apa pun. Itu termasuk hal-hal seperti ekspansi brace, misalnya touch file{1,2,3,4}.

Masalah lain adalah ketika Anda menulis tutorial, agak penting untuk menyadari bahwa pembaca Anda mungkin tidak terlalu berpengalaman dalam subjek. Perintah sederhana bisa lebih dimengerti daripada kombinasi karakter non-huruf yang terlihat aneh. Saya berharap ada sejumlah pengguna shell kasual yang tidak tahu apa :itu, karena alasan sederhana bahwa itu tidak benar - benar melakukan apa - apa. Demikian pula untuk dataran > footanpa perintah: bahkan jika Anda tahu apa redirection, redirection tanpa sumber mungkin tidak intuitif.

Juga, di sini di unix.se kita sering menulis sampel perintah dengan tanda dolar terkemuka untuk menunjukkan prompt. Karakter khusus pada awal baris mungkin bingung dengan itu. (Perhatikan bahwa ada sistem dan shell yang digunakan >sebagai bagian dari prompt default.)

ilkkachu
sumber
4
Dan jika perintahnya tidak sepenuhnya dipahami, selalu ada "sentuhan manusia". Saya ragu bahwa "man:> file" akan mengembalikan sesuatu yang bermanfaat :-) Juga meminta WRT, beberapa (mungkin sebagian besar) memungkinkan Anda untuk mengatur prompt menjadi apa pun yang Anda suka. Milik saya menunjukkan nama sistem (karena saya menggunakan banyak xterms jarak jauh) dan direktori saat ini, dan diatur ke warna berbeda untuk sistem yang berbeda.
jamesqf
1
@ jamesqf, ya. Sekarang, tentu saja ada juga help :atau apa pun yang dimiliki shell Anda untuk dokumentasi. Tetapi itu membutuhkan pengakuan :sebagai perintah dalam dirinya sendiri, mengingat bahwa tidak semuanya memiliki halaman manual, dan akhirnya, dapat ditemukan :dalam dokumentasi. Bagian terakhir bisa sangat sulit. : D
ilkkachu
@ jamesqf, dan yeah, sebagian besar yang saya maksud adalah karakter terakhir dari prompt default.
ilkkachu
1
+1 untuk menunjukkan aspek intuisi dan tidak-menjadi-tidak jelas-konstruk.
mtraceur
@ilkkachu: Ya. Menemukan titik dua dalam dokumentasi tidak terlalu sulit: menemukan yang bukan hanya tanda baca adalah masalah yang berbeda :-)
jamesqf
18

Bagi saya, alasan utamanya adalah keterbacaan. Dengan touch fileAnda tahu apa yang terjadi, bahkan seseorang yang tidak cukup terdidik dalam skrip shell tahu apa yang terjadi. Dan jika tidak, mudah dilakukan man touchdan melihatnya:

A FILE argument that does not exist is created empty

Dengan hal-hal samar seperti :dan >, lebih sulit untuk mengetahui apa yang terjadi, dan karena tidak ada keuntungan nyata, tidak perlu menggunakannya.

yo'
sumber
6

Bayangkan Anda sedang mencari salah satu skrip shell lama yang hanya dapat Anda ingat bahwa beberapa file marker di / tmp sedang dibuat. Sangat mudah untuk mengambil semua file * .sh Anda untuk kata "touch". Grepping for a colon malah akan menghasilkan banyak false positive jika Anda tidak tahu nama file yang tepat untuk dicari.

B dari C
sumber