yang paip atau pipe sebenarnya saluran paip yang tersedia untuk UNIX / Linux dan sangat praktikal. Tetapi untuk memahami sepenuhnya apa itu paip, anda harus tahu bahawa dalam persekitaran * nix ia mempunyai 3 aliran data terbina dalam. Itu, bagi mereka yang tidak tahu, ini bermaksud bahawa data boleh bergerak ke atau dari tiga titik.
Maka anda akan memahami perkara ini dengan cara yang lebih baik, tetapi apa yang ingin saya jelaskan kepada anda sekarang adalah bahawa dengan membuat perancangan, apa yang boleh anda lakukan adalah menyalurkan dari salah satu titik ke yang lain. Ini membolehkan mengambil output atau hasil yang dilemparkan oleh program ke arah input yang lain untuk digunakan, dll. Saya akan cuba menerangkannya dengan beberapa contoh praktikal yang akan membantu anda memahaminya dengan baik.
Perkara-perkara yang saya bicarakan atau aliran data, adalah:
- stdin: sepadan dengan 0 dan merupakan input standard. Secara amnya, input standard untuk sistem * nix adalah papan kekunci. Maksudnya, apa yang anda taipkan adalah maklumat yang digunakan. Dia mempunyai alat khas yang berkaitan dengannya / dev / stdin.
- stdout: dikenal pasti dengan 1, itu adalah output standard. Biasanya ia sesuai dengan monitor atau skrin komputer anda, di mana anda dapat melihat maklumat tersebut. Sebagai contoh, semasa anda menjalankan perintah ls, senarai kandungan akan dipaparkan di skrin, bukan? Peranti yang berkaitan adalah / dev / stdout.
- stderr: dikenal pasti dengan 2, itu adalah output ralat standard, kerana apabila ralat berlaku dalam program. Peranti yang berkaitan ialah / dev / stderr.
Dengan paip anda boleh membuat output standard atau keluar dari satu arahan terus ke input standard yang lain. Maksudnya, anda boleh membuat satu program memberi makan yang lain. Daripada menggunakan parameter yang dimasukkan oleh papan kekunci, pipa menyampaikan maklumat yang dihasilkan oleh arahan sebelumnya melalui saluran paip ini yang diwakili oleh |
dengan contohnya anda akan lebih memahami. Katakan anda ingin menyenaraikan kandungan direktori, tetapi anda hanya berminat melihat nama yang sesuai dengan perkataan doc. Oleh itu, anda boleh menggunakan saluran paip untuk memasukkan output ls ke input penyaring grep untuk memaklumkannya hanya memaparkan yang sesuai dengan corak itu:
ls -l | grep doc
Oleh itu, bukannya menunjukkan kepada anda semua nama, ia hanya menunjukkan kepada anda yang benar-benar menarik minat anda. Anda boleh melakukan perkara yang sama dengan kandungan fail. Bayangkan bahawa anda hanya ingin melihat maklumat proses yang bernama firefox dan bukan semua:
ps aux | grep firefox
Daripada menunjukkan semua output program ps di layar (stdout), yang dilakukannya adalah menyalurkannya ke input input grep filter dan hanya menunjukkan dalam output apa yang sesuai dengan corak firefox dalam kes ini ...
Sekiranya anda mahu, anda boleh menggunakan pelbagai paip untuk membawa output dari satu perintah ke input dari perintah kedua yang lain, dan output yang kedua ke input yang ketiga, dan seterusnya. Sebagai contoh:
cat libro | grep love | more
Seperti yang anda lihat kemungkinannya banyak, semua yang anda bayangkan dan dibenarkan. Walaupun hanya menunjukkan baris pertama dan terakhir fail, hitung garis yang memasuki wc yang berasal dari senarai, dan susun juga:
cat listado | head cat listado | tail cat listado | wc -l cat listado | sort
Anda juga boleh bekerja dengan ralat dengan | & dan misalnya mencari kata amaran dalam output skrip jika gagal:
./miscript |& grep alerta
Dan akhirnya, ada dua perintah yang berkait rapat dengan paip yang tee dan xargs dan bahawa mereka dapat memperluaskan kemungkinan kemungkinan ini. Dalam kes tee, apa yang diizinkan adalah menunjukkan hasil program sebelumnya pada output standard sehingga anda dapat melihatnya, dan selain itu, ia dapat memasukkannya ke fail lain. Contohnya ialah jika anda menyenaraikan kandungan direktori dan ingin melihat output ls -l pada masa ini dan juga menyimpannya dalam senarai fail.txt:
ls -l | tee listado.txt
Sekiranya anda tidak menggunakan tee, anda tidak akan dapat melihat output pada konsol anda ...
Y xargs malah lebih menarik dalam beberapa kes. Dalam kes ini, ia dapat membina perintah dari input standard yang diterimanya melalui saluran paip. Dengan kata lain, ia mampu menangkap semua yang telah dilancarkan oleh program sebelumnya melalui outputnya dan yang mencapai xargs melalui saluran paip untuk meneruskannya sebagai perintah lain sebagai argumen.
Masih tidak faham? Anda akan melihatnya lebih baik dengan contoh. Bayangkan anda mahu membuang semua fail thumbs. Db dari direktori, cakera, atau partition. Sekiranya terdapat banyak, mustahil untuk pergi satu persatu dengan perintah rm untuk menghapusnya secara manual. Tetapi dengan xargs anda dapat mengautomasikan semuanya. Dan anda boleh melakukannya dengan mencari untuk mencari mereka, menghantar output melalui input xarg dan ini seterusnya akan memberi nama rm sebagai argumen. Oleh itu, semua yang terletak akan dipadamkan secara automatik:
find ./ -name "thumbs.db" | xargs rm
Contohnya, anggap cari locates /home/name/thumbs.db, /media/test/thumbs.db, dan /tmp/thumbs.db. Nah, xargs akan memberikannya kepada rm seolah-olah mereka adalah hujah. Iaitu, seolah-olah kita telah melaksanakan: rm /home/name/thumbs.db, kemudian rm /media/test/thumbs.db dan kemudian rm /tmp/thumbs.db.
Hebat, maklumat ini sangat penting bagi kami pengguna linux
Apa artikel yang bagus, sekarang saya sedang mengkaji pengalihan I / O dalam buku Linux Command Line. Lebih jelas bagi saya mengenai paip (Pipeline) dan ketiga aliran data. Sumbangan dihargai. Salam.
Contoh dengan xargs sesuai untuk saya seperti sarung tangan. Tepat hari ini saya berhadapan dengan sedikit butiran jalan keluar berganda yang harus saya hantarkan "dalam beberapa bahagian." xargs berjalan pinturita.
Super bersyukur!