Apa perbedaan menggunakan "file sentuh" ​​dan "> file" dalam membuat file baru?

13

Saya baru mengenal Linux. Ketika saya membuat file .gitignore baru di bawah direktori saat ini menggunakan bash, saya menemukan bahwa saya dapat melakukannya:

> .gitignore

atau

touch .gitignore

Sepertinya mereka melakukan hal yang sama. Ketika saya memeriksa manual untuk touch, ia mengatakan mengubah stempel waktu untuk file saat ini, tetapi tidak ada manual untuk >. Jadi bisakah seseorang menjelaskan apa yang dapat >dilakukan dan apakah ada perbedaan dalam menggunakan kedua perintah ini dalam konteks ini? Terima kasih.

Steve Deng Zishi
sumber
1
Saya ingin tahu di mana Anda belajar menggunakan '>' sebagai file generator tanpa mempelajari maksud penggunaannya
forresthopkinsa
1
Anda akan menemukan pengalihan yang didokumentasikan dalam manual Bash. Di baris perintah, masukkan perintah man bash. Ini dokumen yang panjang dan akan memakan waktu berhari-hari atau bahkan berminggu-minggu untuk dipahami dengan baik, tetapi perlu dilakukan jika Anda ingin mempelajari Bash secara menyeluruh.
Paddy Landau

Jawaban:

21

>adalah operator pengalihan shell. Lihat Apa perbedaan antara ">" dan ">>" dalam perintah shell? dan kapan saya harus menggunakan <atau <() atau << dan> atau> ()? Ini terutama digunakan untuk mengarahkan output dari perintah ke file. Jika file tidak ada, shell akan membuatnya. Jika ada, shell memotongnya (mengosongkannya). Dengan hanya > file, tidak ada perintah, jadi shell membuat file, tetapi tidak ada output yang dikirim ke sana, jadi efek bersihnya adalah pembuatan file kosong, atau mengosongkan file yang sudah ada.

touchadalah perintah eksternal yang membuat file, atau memperbarui cap waktu, seperti yang sudah Anda ketahui. Dengan touch, isi file tidak hilang, jika ada, tidak seperti dengan >.

Perilaku >tergantung pada shell. Di bash, dash, dan sebagian besar shell, > fooakan berfungsi seperti yang Anda harapkan. Di zsh, secara default, > fooberfungsi seperti cat > foo- zsh menunggu Anda mengetik input.

muru
sumber
10
Poin kunci di sini adalah bahwa tidak ada perbedaan praktis antara >> filedan touch filetetapi jika filetidak ada, ada perbedaan besar antara keduanya dan > file(dalam arti bahwa konten sebelumnya filehilang). Itu, ditambah perilaku tidak konsisten dari zsh berarti touch fileadalah "paling aman" dan karenanya harus dihafal sebagai Cara yang Tepat Untuk Melakukannya.
Monty Harder
1

Berikut ini perbandingan yang menarik:

$ cat redirect.sh touch.sh sed.sh awk.sh cp.sh truncate.sh tee.sh vi.sh
> redirect.txt
touch touch.txt
sed 'w sed.txt' /dev/null
awk 'BEGIN {printf > "awk.txt"}'
cp /dev/null cp.txt
truncate -s0 truncate.txt
tee tee.txt </dev/null
vi -esc 'wq vi.txt'

Hasil:

$ strace dash redirect.sh | wc -l
387

$ strace dash touch.sh | wc -l
667

$ strace dash sed.sh | wc -l
698

$ strace dash awk.sh | wc -l
714

$ strace dash cp.sh | wc -l
786

$ strace dash truncate.sh | wc -l
1004

$ strace dash tee.sh | wc -l
1103

$ strace dash vi.sh | wc -l
1472
Steven Penny
sumber
1
Walaupun perbandingannya mungkin menarik, saya tidak benar-benar melihat apa yang Anda ingin saya lihat di sini. Bisakah Anda jelaskan apa tujuan Anda? Saya kira ini cara yang berbeda untuk menulis barang ke file, tapi saya merasa sedikit membingungkan seperti ini. Mungkin kekurangan kopi saya.
m00am
@ m00am apa yang ditampilkan di sini secara efektif 8 cara berbeda untuk membuat file. straceseharusnya menunjukkan pemanggilan sistem yang sedang dieksekusi, dan > file.txtmetode ditampilkan sebagai jumlah pemanggilan sistem yang dieksekusi paling sedikit, yang sebenarnya tidak terlalu mengejutkan - semakin kompleks sebuah alat, semakin kompleks syscall-nya. Masalah dengan contoh-contoh yang ditunjukkan, bagaimanapun adalah bahwa stracemenulis stderrmengalir secara default, dan dalam jawaban ini Steven menggunakan pipa untuk membaca saja stderr, jadi saya sedikit bingung bagaimana dia menghitung garis menggunakan |pipa dan tidak|&
Sergiy Kolodyazhnyy
Dan di Ubuntu 16.04, menggunakan |&, seperti @Serg menyebutkan, saya mendapatkan hitungan sekitar seperlima dari yang di sini ... kecuali untuk vikasus ini, di mana saya mendapatkan nilai yang sama
muru
WSL? Woah ... Saya tidak berpikir WSL akan menambahkan bahwa banyak panggilan sistem untuk apa yang dilakukannya.
muru
@muru Cygwin - WSL belum siap stackoverflow.com/a/40370009
Steven Penny