Saya tahu cat
bisa melakukan ini, tetapi tujuan utamanya adalah untuk menyatukan daripada hanya menampilkan konten.
Saya juga tahu tentang less
dan more
, tetapi saya sedang mencari sesuatu yang sederhana ( bukan pager ) yang hanya menampilkan isi file ke terminal dan itu dibuat khusus untuk ini, jika ada hal seperti itu.
cat
menggabungkan.a+b+c
melibatkan melakukan 2 penambahan, dan komputasia
tidak melibatkan penambahan apa pun. Demikian pula mengeksekusicat f
tidak melibatkan penggabungan apa pun (meskipun ini adalah satu-satunya hal yang "berarti urutan satu file" bisa berarti).cat
membaca file dan menulis file lain (stream), tetapi itu tidak berarti itu adalah gabungan dari apa pun. Haruskah Anda maksud yangcat f
sebenarnya dilakukancat - f
, itu tidak benar.cat
benar-benar dimaksudkan untuk menyatukan (cat file1 file2
akan menggabungkan kedua file ke stdout). Tetapi efek sampingnya adalah, ketika hanya memiliki 1 file sebagai argumen, ia mengeluarkan satu file untuk stdout (ke mana pun pergi, baik terminal Anda, atau diarahkan ke sesuatu). Jadi tidak ada perintah lain yang dibuat hanya untuk keluaran pada stdout, seperti yangcat
ada dan dibiarkan saja. Karena itu Anda ingin menggunakannyacat
.Jawaban:
Yang paling jelas adalah
cat
. Tapi, lihat jugahead
dantail
. Ada juga utillities shell lain untuk mencetak file baris demi baris:sed
,awk
,grep
. Tapi itu adalah untuk mengganti konten file atau mencari di dalam file.Saya membuat beberapa tes untuk memperkirakan mana yang paling efektif. Saya menjalankan semua palung
strace
untuk melihat yang membuat panggilan sistem paling sedikit. File saya memiliki 1.275 baris.awk
: 1355 panggilan sistemcat
: 51 panggilan sistemgrep
: 1337 panggilan sistemhead
: 93 panggilan sistemtail
: 130 panggilan sistemsed
: 1378 panggilan sistemSeperti yang Anda lihat, bahkan jika
cat
dirancang untuk menggabungkan file, itu adalah yang tercepat dan paling efektif.sed
,awk
dangrep
mencetak file baris demi baris, itulah sebabnya mereka memiliki lebih dari 1.275 panggilan sistem.sumber
Tujuannya
cat
persis seperti itu, membaca file dan output ke stdout.sumber
cat --help
mengatakan "FIAT Rangkaian, atau input standar, ke output standar". Saya tidak ingin menggabungkan apa punreadlink /dev/fd/1
misalnya - Anda harus mendapatkan nama tty Anda di sana jika berjalan pada prompt standar. Jadi menggabungkan input ke output adalah apa yang Anda minta lakukan.Pertama,
cat
menulis ke output standar, yang belum tentu terminal, bahkan jikacat
diketik sebagai bagian dari perintah ke shell interaktif. Jika Anda benar-benar membutuhkan sesuatu untuk ditulis ke terminal bahkan ketika output standar dialihkan, itu tidak mudah (Anda perlu menentukan terminal mana, dan mungkin bahkan tidak ada satu jika perintah dijalankan dari skrip), meskipun satu dapat (ab) menggunakan output kesalahan standar jika perintah hanyalah bagian dari pipa. Tetapi karena Anda menunjukkan bahwacat
sebenarnya melakukan pekerjaan itu, saya kira Anda tidak bertanya tentang situasi seperti itu.Jika tujuan Anda adalah mengirimkan apa yang ditulis ke output standar ke dalam pipa, maka menggunakan
cat
akan memenuhi syarat untuk Penggunaan Cat Award yang Tidak Berguna , karenacat file | pipeline
(di manapipeline
singkatan dari pipa apa pun) dapat dilakukan dengan lebih efisien<file pipeline
. Tetapi sekali lagi, dari kata-kata Anda, saya menyimpulkan bahwa ini bukan niat Anda.Jadi tidak begitu jelas apa yang Anda khawatirkan. Jika Anda merasa
cat
terlalu lama untuk mengetik, Anda dapat mendefinisikan alias satu atau dua karakter (masih ada beberapa nama seperti itu yang tetap tidak digunakan dalam Unix standar). Namun jika Anda khawatircat
menghabiskan siklus yang tidak berguna, Anda seharusnya tidak melakukannya.Jika ada program
null
yang tidak menggunakan argumen dan hanya menyalin input standar ke output standar (objek netral untuk jaringan pipa), Anda dapat melakukan apa yang Anda inginkan<file null
. Tidak ada program seperti itu, meskipun akan mudah untuk menulis (program C denganmain
fungsi satu-baris dapat melakukan pekerjaan itu), tetapi memanggilcat
tanpa argumen (ataucat -
jika Anda ingin secara eksplisit) melakukan hal itu.Jika ada
nocat
program yang mengambil tepat satu argumen nama file, mencoba untuk membuka file, mengeluh jika tidak bisa, dan sebaliknya mulai menyalin dari file ke output standar, maka itu akan menjadi apa yang Anda minta. Hanya sedikit lebih sulit untuk menulis daripadanull
, pekerjaan utama adalah membuka file, menguji, dan mungkin mengeluh (jika Anda teliti, Anda mungkin juga ingin memasukkan tes bahwa ada satu argumen, dan mengeluh sebaliknya). Tetapi sekali lagicat
, sekarang disediakan dengan satu argumen, tidak hanya itu, sehingga tidak perlu untuknocat
program apa pun .Setelah Anda berhasil menulis
nocat
program, mengapa berhenti pada satu argumen? Membungkus kode ke dalam loopfor(;*argp!=NULL;++argp)
benar-benar tidak ada usaha sama sekali, menambahkan paling banyak beberapa instruksi mesin ke biner, dan menghindari keharusan mengeluh tentang sejumlah argumen yang salah (yang menyimpan lebih banyak instruksi). Merusak versi primitif daricat
, menyatukan file. (Sejujurnya Anda perlu men-tweak sedikit sehingga tanpa argumen berperilaku seperti itunull
.)Tentu saja dalam
cat
program yang sebenarnya , mereka menambahkan beberapa lonceng dan peluit, karena mereka selalu melakukannya. Tetapi intinya adalah bahwa aspek "gabungan" daricat
biaya benar-benar tidak ada usaha sama sekali, baik untuk programmer maupun untuk mesin yang mengeksekusinya. Fakta yangcat
merangkumnull
dannocat
menjelaskan tidak adanya program tersebut. Hindari menggunakancat
dengan argumen tunggal jika hasilnya masuk ke jalur pipa, tetapi jika itu digunakan hanya untuk menampilkan konten file di terminal, bahkan halaman yang saya tautkan untuk mengakui bahwa ini adalah penggunaan yang bermanfaatcat
, jadi jangan ragu.Anda dapat menguji yang
cat
benar-benar diimplementasikan oleh loop sederhana di sekitarnocat
fungsi hypthetical , dengan memanggilcat
dengan beberapa nama file yang salah satu nama tidak valid, bukan pada posisi pertama: daripada mengeluh segera bahwa file ini tidak ada,cat
pertama-tama dump terlebih dahulu sebelumnya file yang valid, dan kemudian mengeluh tentang file yang tidak valid (setidaknya itulah perilaku kucing saya).sumber
Sedang
zsh
dicobaSaya percaya ini adalah cara terpendek untuk mencetak file. Ini menggunakan 'tersembunyi'
cat
(ataumore
jika stdout adalah terminal), tetapi perintah yang digunakan untuk pencetakan dikendalikan olehREADNULLCMD
variabel yang Anda dapat dengan aman menimpa langsung dengan nama perintah atau bahkan oleh beberapa fungsi. Misalnya untuk mencetak file dengan penomoran baris:sumber
POSIX mendefinisikan cat sebagai:
Jadi saya pikir menggabungkan di sini berarti membaca file secara berurutan .
sumber
Saya tahu ini pertanyaan masa lalu. Secara teknis, karena mencetak isi suatu file
stdout
adalah bentuk gabungan,cat
secara semantik sesuai. Jangan lupa bahwaprintf
secara semantik dimaksudkan untuk memformat dan mencetak data. Bash juga menyediakan sintaks untuk mengarahkan input dan output dari file. Kombinasi ini dapat menghasilkan ini:sumber
cat file.txt
, karena perintah itu akan menghapus baris baru yang tertinggal (yang$(...)
melakukan ini).Menggunakan
bash
bawaan dan menghindari pembuatan subproses:IFS
hanya akan diterapkan padaread
perintah, jadi jangan khawatir tentangIFS
perubahan global Anda .Diperlukan loop untuk menangani karakter nol (terima kasih kepada Stéphane Chazelas).
Cara ini tidak cocok untuk file besar karena konten file membaca variabel (jadi memori) terlebih dahulu. BTW Saya sudah mencoba untuk mencetak file teks 39M dengan cara ini dan penggunaan memori bash tidak melebihi 5M, jadi tidak yakin tentang kasus ini.
Ini juga sangat lambat dan CPU tidak efisien: untuk file 39M yang sama butuh ~ 3 menit dengan 100% penggunaan single core.
Untuk file besar atau binari lebih baik digunakan
cat '/path/to/file'
atau bahkandd if='/path/to/file' bs=1M
jika memungkinkan.sumber
pv -q
yang di Linux dapat digunakansplice()
yang untuk beberapa jenis stdin / stdout akan meningkatkan kinerja.Sama seperti demonstrasi, Anda bisa melakukannya
sumber