Ini mungkin ada di banyak FAQ - daripada menggunakan:
cat file | command
(yang disebut penggunaan kucing yang tidak berguna), cara yang benar seharusnya adalah:
command < file
Cara ke-2, "benar" - OS tidak harus mengeluarkan proses tambahan.
Meski tahu itu, saya terus menggunakan kucing yang tidak berguna karena 2 alasan.
lebih estetis - Saya suka saat data bergerak secara seragam hanya dari kiri ke kanan. Dan lebih mudah untuk mengganti
cat
dengan sesuatu yang lain (gzcat
,echo
, ...), menambahkan 2 file atau masukkan filter baru (pv
,mbuffer
,grep
...).Saya "merasa" mungkin lebih cepat dalam beberapa kasus. Lebih cepat karena ada 2 proses, pertama (
cat
) membaca dan kedua melakukan apa saja. Dan mereka dapat berjalan secara paralel, yang berarti terkadang eksekusi lebih cepat.
Apakah logika saya benar (untuk alasan kedua)?
sumber
cat
adalah pipa identitas . Itu hanya mengalirkan inputnya ke outputnya. Jika program kedua dalam rangkaian dapat mengambil masukannya dari argumen yang sama yang Anda berikancat
(atau dari masukan standar, jika Anda tidak memberikan argumen), makacat
sama sekali tidak berguna dan hanya menghasilkan proses tambahan yang bercabang dan pipa tambahan menjadi dibuat.-
, itu adalah pipa identitas. Ketika itu memiliki lebih dari satu argumen nama file non-tanda hubung, itu menjadi sesuatu yang lebih dari sekadar pipa identitas, dan mulai melayani tujuan yang sebenarnya.<file command1 | command2
, meskipun akan ada ketidaksepakatan tentang estetika.Jawaban:
Saya tidak mengetahui penghargaan tersebut sampai hari ini ketika beberapa pemula mencoba menyematkan UUOC pada saya untuk salah satu jawaban saya. Itu adalah
cat file.txt | grep foo | cut ... | cut ...
. Saya memberinya sebagian dari pikiran saya, dan hanya setelah melakukannya mengunjungi tautan yang dia berikan kepada saya mengacu pada asal-usul penghargaan dan praktik melakukannya. Pencarian lebih lanjut membawa saya ke pertanyaan ini. Agak sayangnya, meski telah dipertimbangkan secara sadar, tidak ada jawaban yang sesuai dengan alasan saya.Saya tidak bermaksud untuk bersikap defensif dalam menanggapi dia. Lagi pula, di tahun-tahun muda saya, saya akan menulis perintah
grep foo file.txt | cut ... | cut ...
karena setiap kali Anda melakukan single yang seringgrep
Anda pelajari penempatan argumen file dan sudah menjadi pengetahuan bahwa yang pertama adalah pola dan yang kemudian adalah nama file.Itu adalah pilihan sadar untuk digunakan
cat
ketika saya menjawab pertanyaan, sebagian karena alasan "selera yang baik" (dalam kata-kata Linus Torvalds) tetapi terutama karena alasan fungsi yang memaksa.Alasan terakhir lebih penting jadi saya akan memadamkannya dulu. Ketika saya menawarkan pipa sebagai solusi, saya berharap pipa itu dapat digunakan kembali. Kemungkinan besar pipa akan ditambahkan di ujung atau disambung ke pipa lain. Dalam hal ini memiliki argumen file untuk grep mengacaukan penggunaan kembali, dan sangat mungkin melakukannya secara diam - diam tanpa pesan kesalahan jika argumen file ada. I. e.
grep foo xyz | grep bar xyz | wc
akan memberi Anda berapa banyak baris yangxyz
dimuatbar
sementara Anda mengharapkan jumlah baris yang berisi keduanyafoo
danbar
. Harus mengubah argumen menjadi perintah dalam pipeline sebelum menggunakannya rentan terhadap kesalahan. Tambahkan kemungkinan kegagalan diam-diam dan ini menjadi praktik yang sangat berbahaya.Alasan yang pertama juga tidak penting karena banyak " selera yang baik " hanyalah alasan bawah sadar intuitif untuk hal-hal seperti kegagalan diam-diam di atas yang tidak dapat Anda pikirkan tepat pada saat seseorang yang membutuhkan pendidikan berkata "tetapi tidak kucing itu tidak berguna ".
Namun, saya akan mencoba untuk juga menyadarkan alasan "rasa enak" yang saya sebutkan. Alasan itu berkaitan dengan semangat desain ortogonal Unix.
grep
tidakcut
danls
tidakgrep
. Oleh karena itu setidaknyagrep foo file1 file2 file3
bertentangan dengan semangat desain. Cara ortogonal untuk melakukannya adalahcat file1 file2 file3 | grep foo
. Sekarang,grep foo file1
hanya kasus khususgrep foo file1 file2 file3
, dan jika Anda tidak memperlakukannya sama Anda setidaknya menggunakan siklus jam otak mencoba untuk menghindari penghargaan kucing tidak berguna.Itu membawa kita ke argumen yang
grep foo file1 file2 file3
menggabungkan, dancat
menggabungkan sehingga itu tepatcat file1 file2 file3
tetapi karenacat
tidak digabungkancat file1 | grep foo
sehingga kita melanggar semangatcat
Unix yang maha kuasa. Nah, jika itu masalahnya maka Unix akan membutuhkan perintah yang berbeda untuk membaca output dari satu file dan memuntahkannya ke stdout (bukan mem-paginasi atau apa pun hanya meludah murni ke stdout). Jadi Anda akan memiliki situasi di mana Anda mengatakancat file1 file2
atau Anda mengatakandog file1
dan dengan cermat ingat untuk menghindaricat file1
untuk menghindari mendapatkan penghargaan, sambil juga menghindaridog file1 file2
karena semoga desaindog
akan menimbulkan kesalahan jika beberapa file ditentukan.Mudah-mudahan, pada titik ini, Anda bersimpati dengan desainer Unix karena tidak menyertakan perintah terpisah untuk memuntahkan file ke stdout, sementara juga memberi nama
cat
untuk penggabungan daripada memberinya nama lain.<edit>
menghapus komentar yang salah pada<
, pada kenyataannya,<
adalah fasilitas no-copy yang efisien untuk meludahkan file ke stdout yang dapat Anda posisikan di awal pipeline sehingga desainer Unix memasukkan sesuatu yang khusus untuk ini</edit>
Pertanyaan selanjutnya adalah mengapa penting untuk memiliki perintah yang hanya memuntahkan file atau penggabungan beberapa file ke stdout, tanpa pemrosesan lebih lanjut? Salah satu alasannya adalah untuk menghindari setiap perintah Unix yang beroperasi pada input standar untuk mengetahui bagaimana mengurai setidaknya satu argumen file baris perintah dan menggunakannya sebagai input jika ada. Alasan kedua adalah untuk menghindari pengguna harus mengingat: (a) ke mana perginya argumen nama file; dan (b) menghindari bug pipa diam seperti yang disebutkan di atas.
Itu membawa kita pada mengapa
grep
memiliki logika ekstra. Alasannya adalah untuk memungkinkan kelancaran pengguna untuk perintah yang sering digunakan dan berdiri sendiri (bukan sebagai pipeline). Ini adalah sedikit kompromi ortogonalitas untuk keuntungan yang signifikan dalam kegunaan. Tidak semua perintah harus dirancang dengan cara ini dan perintah yang tidak sering digunakan harus sepenuhnya menghindari logika ekstra dari argumen file (ingat logika tambahan menyebabkan kerapuhan yang tidak perlu (kemungkinan bug)). Pengecualiannya adalah mengizinkan argumen file seperti dalam kasusgrep
. (Ngomong-ngomong, perhatikan bahwals
memiliki alasan yang sama sekali berbeda untuk tidak hanya menerima tetapi cukup banyak membutuhkan argumen file)Akhirnya, apa yang bisa dilakukan dengan lebih baik adalah jika perintah luar biasa seperti
grep
(tetapi tidak harusls
) menghasilkan kesalahan jika input standar juga tersedia ketika argumen file ditentukan.sumber
grep
dipanggil dengan beberapa nama file, itu mengawali baris yang ditemukan dengan nama file yang ditemukannya (kecuali Anda mematikan perilaku itu). Itu juga dapat melaporkan nomor baris di file individual. Jika hanya digunakancat
untuk memberi makangrep
, Anda akan kehilangan nama file, dan nomor baris terus menerus di semua file, bukan per file. Jadi ada alasan untukgrep
menangani banyak file itu sendiri yangcat
tidak dapat ditangani. Kasus file tunggal dan file nol hanyalah kasus khusus dari penggunaan multi-file umumgrep
.< file command1 ...
. Meskipun posisi konvensional untuk operator pengalihan I / O adalah setelah nama perintah dan argumennya, itu hanya konvensi dan bukan penempatan wajib. Itu<
harus mendahului nama file. Jadi, ada dekat dengan simetri sempurna antara>output
dan<input
pengalihan:<input command1 -opt 1 | command2 -o | command3 >output
.cat
tidak berguna. Bukan itu tidakcat
berguna; itu adalah konstruksi tertentu tidak membutuhkan penggunaancat
. Jika Anda suka, perhatikan bahwa itu adalah UUoC (Useless Use ofcat
), dan bukan UoUC (Use of Uselesscat
). Ada banyak kesempatan ketikacat
alat yang tepat untuk digunakan; Saya tidak punya masalah dengan itu digunakan ketika itu adalah alat yang tepat untuk digunakan (dan, memang, sebutkan kasus dalam jawaban saya).cat
dalam pipa mungkin bukan masalah besar tergantung pada datanya, tetapi ketika digunakan sebagai lingkungan pemrograman, sangat penting untuk mengimplementasikan kinerja hal-hal penting ini; terutama ketika berurusan denganbash
yang, dari segi kinerja, seperti roda berbentuk persegi panjang (dibandingkan denganksh
bagaimanapun juga. Saya berbicara hingga 10x lebih lambat di sini - tidak main-main). Anda benar- benar ingin mengoptimalkan fork Anda (dan bukan hanya itu) saat berhadapan dengan skrip yang lebih besar atau loop besar.Nggak!
Pertama-tama, tidak masalah di mana dalam perintah pengalihan terjadi. Jadi jika Anda suka pengalihan ke kiri perintah Anda, tidak apa-apa:
sama dengan
Kedua, ada n + 1 proses dan subkulit terjadi saat Anda menggunakan pipa. Ini jelas lebih lambat. Dalam beberapa kasus n akan menjadi nol (misalnya, saat Anda mengarahkan ke shell bawaan), jadi dengan menggunakan
cat
Anda menambahkan proses baru sama sekali tidak perlu.Sebagai generalisasi, kapan pun Anda menemukan diri Anda menggunakan pipa, perlu waktu 30 detik untuk melihat apakah Anda dapat menghilangkannya. (Tapi mungkin tidak perlu memakan waktu lebih dari 30 detik.) Berikut adalah beberapa contoh di mana pipa dan proses sering digunakan secara tidak perlu:
Jangan ragu untuk mengedit untuk menambahkan lebih banyak contoh.
sumber
< cat grep dog
adalah contoh yang dibuat-buat untuk menunjukkan bahwa Anda tidak dapat dengan mudah membedakan antara file input, perintah yang menerima masukan, dan argumen untuk perintah tersebut.stdout=$(foo bar -exec baz <qux | ENV=VAR quux)
. T. Apakah<qux
berlaku untukfoo
, atau untukbaz
, yang-exec
'd byfoo
? A. Ini berlaku untukfoo
, tetapi bisa tampak ambigu. Menempatkan<qux
sebelumnyafoo
dalam kasus ini lebih jelas, meskipun kurang umum, dan analog dengan trailingENV=VAR quux
.<"cat" grep dog
lebih mudah dibaca, ya. (Saya biasanya pro-whitespace, tetapi kasus khusus ini sangat pengecualian).Saya tidak setuju dengan sebagian besar contoh Penghargaan UUOC yang terlalu sombong karena, ketika mengajar orang lain,
cat
adalah tempat yang nyaman untuk setiap perintah atau alur perintah rumit yang menghasilkan keluaran yang sesuai untuk masalah atau tugas yang sedang dibahas.Ini terutama berlaku di situs-situs seperti Stack Overflow, ServerFault, Unix & Linux atau situs SE lainnya.
Jika seseorang secara khusus bertanya tentang pengoptimalan, atau jika Anda ingin menambahkan informasi tambahan tentang itu, bagus, bicarakan tentang bagaimana menggunakan cat tidak efisien. Tetapi jangan mencaci orang karena mereka memilih untuk bertujuan untuk kesederhanaan dan kemudahan pemahaman dalam contoh mereka daripada melihat-saya-bagaimana-keren-saya-! kompleksitas.
Singkatnya, karena kucing tidak selalu kucing.
Juga karena kebanyakan orang yang senang berkeliling memberikan UUOC melakukannya karena mereka lebih mementingkan pamer tentang betapa 'pintar' mereka daripada membantu atau mengajar orang. Pada kenyataannya, mereka menunjukkan bahwa mereka mungkin hanyalah pemula lain yang telah menemukan tongkat kecil untuk mengalahkan rekan-rekan mereka.
Memperbarui
Ini UUOC lain yang saya posting sebagai jawaban di https://unix.stackexchange.com/a/301194/7696 :
Pedant UUOC akan mengatakan bahwa itu adalah UUOC karena sangat mungkin untuk membuat
$filter
default ke string kosong dan memilikiif
pernyataan dofilter='| grep -v "^$"'
tapi IMO, dengan tidak menyematkan karakter pipa di$filter
, "tidak berguna" inicat
melayani tujuan yang sangat berguna untuk mendokumentasikan fakta secara mandiri bahwa$filter
padaprintf
baris itu bukan hanya argumen lainsqlplus
, itu adalah filter keluaran opsional yang dapat dipilih pengguna.Jika ada kebutuhan untuk memiliki beberapa keluaran filter opsional, pengolahan pilihan bisa hanya append
| whatever
ke$filter
sesering yang diperlukan - satu ekstracat
di dalam pipa tidak akan sakit apa pun atau menyebabkan kerugian terlihat dari kinerja.sumber
==
inside[ ]
tidak ditentukan oleh POSIX, dan tidak semua implementasi menerimanya. Operator standar itu adil=
.Dengan versi UUoC,
cat
harus membaca file ke memori, lalu menulisnya ke pipa, dan perintah harus membaca data dari pipa, jadi kernel harus menyalin seluruh file tiga kali sedangkan dalam kasus yang diarahkan ulang, kernel hanya perlu menyalin file satu kali. Lebih cepat melakukan sesuatu sekali daripada melakukannya tiga kali.Menggunakan:
adalah penggunaan yang sepenuhnya berbeda dan tidak selalu tidak berguna
cat
. Masih tidak berguna jika perintahnya adalah filter standar yang menerima nol atau lebih argumen nama file dan memprosesnya secara bergantian. Perhatikantr
perintahnya: ini adalah filter murni yang mengabaikan atau menolak argumen nama file. Untuk memberi makan banyak file ke dalamnya, Anda harus menggunakancat
seperti yang ditunjukkan. (Tentu saja, ada diskusi terpisah bahwa desainnyatr
tidak terlalu bagus; tidak ada alasan sebenarnya itu tidak dapat dirancang sebagai filter standar.) Ini mungkin juga valid jika Anda ingin perintah memperlakukan semua input sebagai a file tunggal daripada sebagai beberapa file terpisah, bahkan jika perintah akan menerima beberapa file terpisah: misalnya,wc
adalah perintah seperti itu.Ini adalah
cat single-file
kasus yang tidak berguna tanpa syarat.sumber
Untuk membela kucing:
Iya,
atau
lebih efisien, tetapi banyak pemanggilan tidak memiliki masalah kinerja, jadi Anda tidak peduli.
alasan ergonomis:
Kami terbiasa membaca dari kiri ke kanan, jadi perintah seperti
sepele untuk dipahami.
harus melompati proses1, dan kemudian membaca dari kiri ke kanan. Ini dapat disembuhkan dengan:
terlihat entah bagaimana, seolah-olah ada anak panah yang menunjuk ke kiri, di mana tidak ada apa-apa. Lebih membingungkan dan tampak seperti kutipan mewah adalah:
dan membuat skrip sering kali merupakan proses yang berulang,
di mana Anda melihat kemajuan Anda secara bertahap, sementara
bahkan tidak berhasil. Cara-cara sederhana lebih sedikit rawan kesalahan dan perintah katenasi ergonomis sederhana dengan kucing.
Topik lainnya adalah, bahwa kebanyakan orang terpapar> dan <sebagai operator pembanding, jauh sebelum menggunakan komputer dan saat menggunakan komputer sebagai pemrogram, jauh lebih sering terpapar pada hal ini.
Dan membandingkan dua operan dengan <dan> adalah kontra komutatif, yang artinya
Saya ingat pertama kali menggunakan <untuk pengalihan input, saya takut
bisa berarti sama dengan
dan entah bagaimana menimpa skrip a.sh saya. Mungkin ini menjadi masalah bagi banyak pemula.
perbedaan langka
Yang terakhir dapat digunakan dalam perhitungan secara langsung.
Tentu saja <dapat digunakan di sini juga, sebagai ganti parameter file:
tapi siapa yang peduli - 15k?
Jika saya sesekali mengalami masalah, pasti saya akan mengubah kebiasaan saya memanggil kucing.
Saat menggunakan file yang sangat besar atau banyak, menghindari cat tidak masalah. Untuk sebagian besar pertanyaan, penggunaan kucing bersifat ortogonal, di luar topik, bukan masalah.
Memulai diskusi tentang penggunaan kucing yang tidak berguna dan tidak berguna pada setiap topik shell kedua hanya akan mengganggu dan membosankan. Dapatkan kehidupan dan tunggu menit ketenaran Anda, saat berhadapan dengan pertanyaan kinerja.
sumber
file > a.sh
adalah sepadan dengan waktu membaca ini :) Terima kasih telah berbagi!cat file | wc -c
,wc
perlu membaca stdin hingga EOF, menghitung byte. Tetapi dalam hal ini,wc -c < file
hanya statistik stdin, menemukan itu file biasa dan mencetak st_size daripada membaca masukan apa pun. Untuk file besar perbedaan performanya akan terlihat jelas.Masalah tambahan adalah bahwa pipa dapat menutupi subkulit secara diam-diam. Untuk contoh ini, saya akan mengganti
cat
denganecho
, tetapi masalah yang sama ada.Anda mungkin berharap
x
mengandungfoo
, tetapi ternyata tidak. Yangx
Anda setel berada di subkulit yang ditelurkan untuk menjalankanwhile
loop.x
di shell yang memulai pipeline memiliki nilai yang tidak terkait, atau tidak disetel sama sekali.Di bash4, Anda bisa mengonfigurasi beberapa opsi shell sehingga perintah terakhir dari pipeline dijalankan di shell yang sama dengan yang memulai pipeline, tetapi Anda dapat mencobanya.
dan
x
sekali lagi lokal untukwhile
subkulit itu.sumber
shopt -s lastpipe
menghindari pembuatan subkulit.Sebagai seseorang yang secara teratur menunjukkan ini dan sejumlah antipattern pemrograman shell lainnya, saya merasa berkewajiban, terlambat, mempertimbangkan.
Skrip shell sangat mirip dengan bahasa salin / tempel. Bagi kebanyakan orang yang menulis skrip shell, mereka tidak di dalamnya untuk mempelajari bahasa; itu hanya kendala yang harus mereka atasi untuk terus melakukan hal-hal dalam bahasa yang sebenarnya mereka kenal.
Dalam konteks itu, saya melihatnya sebagai mengganggu dan bahkan berpotensi merusak untuk menyebarkan berbagai anti-pola shell scripting. Kode yang ditemukan seseorang di Stack Overflow idealnya dapat disalin / ditempelkan ke lingkungan mereka dengan sedikit perubahan, dan pemahaman yang tidak lengkap.
Di antara banyak sumber daya skrip shell di internet, Stack Overflow tidak biasa karena pengguna dapat membantu membentuk kualitas situs dengan mengedit pertanyaan dan jawaban di situs. Namun, pengeditan kode bisa menjadi masalah karena mudah untuk membuat perubahan yang tidak dimaksudkan oleh pembuat kode. Karenanya, kami cenderung meninggalkan komentar untuk menyarankan perubahan pada kode.
UUCA dan komentar antipattern terkait tidak hanya untuk penulis kode yang kami komentari; mereka sebagai peringatan untuk membantu pembaca situs menjadi sadar akan masalah dalam kode yang mereka temukan di sini.
Kami tidak dapat berharap untuk mencapai situasi di mana tidak ada jawaban di Stack Overflow yang merekomendasikan
cat
s yang tidak berguna (atau variabel yang tidak dikutip, atauchmod 777
, atau berbagai macam wabah antipattern lainnya), tetapi setidaknya kami dapat membantu mendidik pengguna yang akan menyalin / tempel kode ini ke loop ketat terdalam dari skrip mereka yang dieksekusi jutaan kali.Sejauh alasan teknis, kearifan tradisional adalah bahwa kita harus mencoba meminimalkan jumlah proses eksternal; ini terus berlaku sebagai panduan umum yang baik saat menulis skrip shell.
sumber
cat
banyak switch konteks tambahan dan bandwidth memori (dan polusi cache L3 dari salinan tambahan data dalamcat
buffer baca, dan buffer pipa). Terutama pada mesin multi-core yang besar (seperti banyak pengaturan hosting) cache / bandwidth memori adalah sumber daya bersama.bzip2
dangzip
kompresi keduanya sangat lambat dibandingkan dengan jumlah overhead yangcat
ditambahkan ke dalamnya saja (dengan mesin jika tidak menganggur). Sulit untuk membaca tabel Anda (garis membungkus di tengah angka?).sys
waktu meningkat pesat, tetapi masih kecil vs. pengguna atau nyata?Saya sering menggunakan
cat file | myprogram
contoh. Kadang-kadang saya dituduh menggunakan kucing yang tidak berguna ( http://porkmail.org/era/unix/award.html ). Saya tidak setuju karena alasan berikut:Mudah untuk memahami apa yang sedang terjadi.
Saat membaca perintah UNIX Anda mengharapkan perintah yang diikuti oleh argumen yang diikuti dengan pengalihan. Anda dapat meletakkan pengalihan di mana saja tetapi jarang terlihat - sehingga orang akan lebih sulit membaca contoh. aku percaya
lebih mudah dibaca daripada
Jika Anda memindahkan pengalihan ke awal, Anda membingungkan orang-orang yang tidak terbiasa dengan sintaks ini:
dan contoh harus mudah dipahami.
Mudah untuk berubah.
Jika Anda mengetahui bahwa program dapat membaca
cat
, biasanya Anda dapat berasumsi bahwa program dapat membaca keluaran dari program apa pun yang menghasilkan STDOUT, dan dengan demikian Anda dapat menyesuaikannya untuk kebutuhan Anda sendiri dan mendapatkan hasil yang dapat diprediksi.Ini menekankan bahwa program tidak gagal, jika STDIN bukan file.
Tidaklah aman untuk mengasumsikan bahwa jika
program1 < foo
berhasil makacat foo | program1
akan juga berhasil. Namun, aman untuk mengasumsikan sebaliknya. Program ini berfungsi jika STDIN adalah file, tetapi gagal jika inputnya adalah pipa, karena menggunakan seek:Biaya kinerja
Ada biaya untuk melakukan tambahan
cat
. Untuk memberikan gambaran tentang seberapa banyak saya menjalankan beberapa tes untuk mensimulasikan baseline (cat
), throughput rendah (bzip2
), throughput sedang (gzip
), dan throughput tinggi (grep
).Pengujian dijalankan pada sistem low end (0,6 GHz) dan laptop biasa (2,2 GHz). Tes tersebut dijalankan 10 kali pada setiap sistem dan waktu terbaik dipilih untuk meniru situasi optimal untuk setiap pengujian. $ ISO adalah ubuntu-11.04-desktop-i386.iso. (Tabel yang lebih cantik di sini: http://oletange.blogspot.com/2013/10/useless-use-of-cat.html )
Hasil penelitian menunjukkan bahwa untuk throughput rendah dan sedang biaya berada di urutan 1%. Ini masih dalam ketidakpastian pengukuran, jadi dalam praktiknya tidak ada perbedaan.
Untuk throughput yang tinggi, perbedaannya lebih besar dan ada perbedaan yang jelas antara keduanya.
Yang mengarah pada kesimpulan: Anda harus menggunakan
<
bukancat |
jika:Jika tidak, tidak masalah apakah Anda menggunakan
<
ataucat |
.Dan dengan demikian Anda hanya harus memberikan UUoC-award jika dan hanya jika:
sumber
Menurut saya (cara tradisional) menggunakan pipa lebih cepat; di kotak saya, saya menggunakan
strace
perintah untuk melihat apa yang terjadi:Tanpa pipa:
Dan dengan pipa:
Anda dapat melakukan beberapa pengujian dengan
strace
dantime
perintah dengan perintah yang lebih banyak dan lebih panjang untuk pembandingan yang baik.sumber
strace
menunjukkan bahwa ini lebih cepat -strace
tidak menelusuriwc -l
eksekusi dalam kasus kedua. Ini hanya melacak perintah pertama dari pipeline di sini.strace -f sh -c 'wc -l < wrong_output.c'
disandingkanstrace -f sh -c 'cat wrong_output.c | wc -l'
.cat
: ideone.com/2w1W42#stderrmkfifo
membuat pipa bernama . Pipa anonim disiapkan denganpipe(2)
dan kemudian bercabang, dan meminta induk dan anak menutup ujung pipa yang berbeda. Tapi ya, jawaban ini benar-benar tidak masuk akal, dan bahkan tidak mencoba menghitung panggilan sistem atau digunakanstrace -O
untuk mengukur overhead, atau-r
memberi stempel waktu setiap panggilan relatif terhadap yang terakhir ...