Apa yang dilakukan simbol pipa linux “|”? [duplikat]

23

Berikut adalah perintah yang mengurutkan file dalam folder dengan urutan terbalik

ls | sort -r

Apa yang dilakukan |simbol dalam perintah itu?

Apa yang saya benar-benar cari di sini adalah penjelasan pipa untuk pemula Linux tingkat tinggi (mudah dimengerti). Saya melihat pertanyaan lain tentang pipa di sini pada Superuser, tetapi tidak ada yang memunculkan jawaban yang menjelaskan secara sederhana apa yang mereka lakukan dan bagaimana mereka berbeda dari pengalihan ( simbol >atau <).

ccalvert
sumber
7
Ini tidak ada hubungannya dengan Linux (yang merupakan kernel). Pipa pada umumnya adalah cara mengarahkan kembali input / output, dalam shell seperti bash itu tidak berbeda. Satu-satunya hal khusus tentang a |adalah bahwa ia tidak menggunakan nama, output dari perintah l-hand diteruskan langsung ke input untuk perintah di sisi-r pipa.
Andon M. Coleman
Untuk pelajaran sejarah tentang masalah ini, baca linfo.org/pipe.html
Fredrik Pihl
ls -1r(Perhatikan argumen nomor satu) harus menghasilkan hasil yang mirip dengan ls | sort -r.
Ivan Chau
Saya suka menjelaskannya seperti itu: Sebuah pipa mengambil output dari satu perintah dan membuatnya dapat digunakan untuk perintah berikut. Misalnya, Anda bisa melakukannya cat /somefile | grep cool. Ini akan mengambil output dari somefile dan membuatnya tersedia untuk grep, dan kemudian grep akan mencetak semua baris dengan kata cool di dalamnya.
JohnDoea

Jawaban:

26

Berikut ini sedikit disederhanakan untuk membantu pengguna baru.

Pertama-tama, perlu memahami konsep input standar dan output standar.

Di Linux dan sistem operasi mirip UNIX lainnya, setiap proses memiliki input standar ( stdin) dan output standar ( stdout). Situasi yang biasa adalah itu stdinadalah keyboard Anda dan stdoutmerupakan layar atau jendela terminal Anda.

Jadi ketika Anda menjalankan ls, itu akan membuang outputnya stdout. Jika Anda tidak melakukan apa pun, itu akan pergi ke layar atau jendela terminal Anda, dan Anda akan melihatnya.

Sekarang, beberapa perintah Linux berinteraksi dengan pengguna, dan gunakan stdinuntuk melakukan itu, editor teks Anda menjadi salah satunya. Bunyinya dari stdinmenerima menerima penekanan tombol Anda, melakukan hal-hal, dan kemudian menulis hal-hal untuk stdout.

Namun, ada juga perintah non-interaktif atau "filter" yang TIDAK bekerja secara interaktif, tetapi menginginkan banyak data. Perintah-perintah ini akan mengambil semua yang stdindimiliki, melakukan sesuatu untuk itu, dan kemudian melemparkannya kestdout

Mari kita lihat perintah lain yang disebut du- singkatan untuk penggunaan disk. du /usr, misalnya, akan mencetak (untuk stdoutmenyukai perintah Linux lainnya) daftar setiap file dalam direktori itu dan ukurannya:

# du /usr
2312    /usr/games
124     /usr/lib/tc
692     /usr/lib/rygel-1.0
400     /usr/lib/apt/methods
40      /usr/lib/apt/solvers
444     /usr/lib/apt
6772    /usr/lib/gnash

Seperti yang dapat Anda katakan langsung dari kelelawar, itu tidak diurutkan, dan Anda mungkin ingin itu diurutkan berdasarkan ukuran.

sortadalah salah satu dari perintah "filter" yang akan mengambil banyak hal dari stdindan mengurutkannya.

Jadi, jika kita melakukan ini:

# du /usr | sort -nr

kami mendapatkan ini, yang sedikit lebih baik:

4213348 /usr
2070308 /usr/lib
1747764 /usr/share
583668  /usr/lib/vmware
501700  /usr/share/locale
366476  /usr/lib/x86_64-linux-gnu
318660  /usr/lib/libreoffice
295388  /usr/lib/vmware/modules
290376  /usr/lib/vmware/modules/binary
279056  /usr/lib/libreoffice/program
216980  /usr/share/icons

Dan sekarang Anda dapat melihat bahwa "pipa" menghubungkan perintah stdoutdari satu ke yang stdinlainnya. Biasanya Anda akan menggunakannya dalam situasi seperti ini di mana Anda ingin memfilter, mengurutkan atau memanipulasi output dari suatu perintah. Mereka dapat di-cascade jika Anda ingin memproses output melalui beberapa perintah tipe filter.

Jika Anda mengetik sortsendiri, ia masih akan mencoba membaca stdin. Karena stdinterhubung ke keyboard Anda, itu akan menunggu Anda untuk mengetik, dan memproses semuanya sampai Anda menekan Control-D. Ini tidak akan meminta Anda karena itu tidak dimaksudkan untuk digunakan secara interaktif.

Adalah mungkin bagi suatu program untuk mengetahui apakah stdinitu interaktif atau tidak, sehingga beberapa program mungkin bertindak berbeda jika Anda mengeluarkannya sendiri atau di ujung pipa.

Juga, mem-pip sebuah program yang hanya berfungsi secara interaktif, seperti vi, akan mengakibatkan Anda mengalami kesulitan.

Pipa berbeda dari pengalihan karena data diacak dari satu perintah ke perintah berikutnya tanpa disimpan di mana pun. Jadi, dalam contoh di atas, duoutput tidak disimpan di mana pun. Sebagian besar waktu Anda tidak ingin ini dengan pipa karena alasan untuk menggunakan pipa adalah untuk memproses output dari suatu perintah - tetapi, ada perintah teeyang memungkinkan Anda memiliki kue dan memakannya juga, itu akan salin apa yang diterimanya dari stdinkeduanya stdoutdan file pilihan Anda. Anda juga dapat melakukan ini bashdengan sintaksis misterius yang melibatkan ampersand dan tanda kurung yang tidak saya ketahui.

LawrenceC
sumber
Perhatikan bahwa ini tidak unik untuk Linux, atau bahkan POSIX. Sebagian besar (semua?) Kerang pada Windows melakukan ini juga. Dan mungkin OS lainnya.
Bob
Saya tahu konsep stdindan stdoutberbeda di bawah Windows daripada di Linux, meskipun mungkin tidak terlalu banyak dari sudut pandang Windows cmd.exeatau Powershell.
LawrenceC
Saya cukup penasaran tentang perbedaannya - maukah Anda menjelaskannya? Mungkin dalam obrolan jika komentar bukan tempat yang baik untuk itu.
Bob
1
Program Win32 pasti memiliki input dan output standar. Misalnya, Anda dapat mengambil input standar, keluaran atau pegangan kesalahan dengan fungsi Win32 GetStdHandle(). Ini juga mudah untuk mengarahkan aliran standar proses [anak] yang dihasilkan dengan .NET, yang saya percaya memetakan fungsi-fungsi Win32 (tapi saya tidak 100% yakin akan hal itu - saya bukan pengembang Win32).
Bob
1
Ah, inilah persamaan Win32, dengan mengatur parameter yang sesuai dalam STARTUPINFOstruct untuk CreateProcess().
Bob
27

Jika Anda merasa nyaman dengan pengalihan output dan input, penjelasannya sangat mudah.

Command1 | Command2

melakukan hal yang sama dengan

Command1 > tempfile
Command2 < tempfile

tapi tanpa tempfile. Output dari Command1terhubung langsung ke input Command2dan transfer terjadi dalam memori.

Daniel B
sumber
Saya bisa saja salah tetapi saya pikir tempfile ada bahkan dalam sintaksis pipa. Itu tidak memiliki nama.
Taemyr
3
Tidak. Tidak ada operasi sistem file yang terlibat ketika memipil output dari satu perintah ke input perintah lain.
Daniel B
1
Meskipun, di bawah DOS (dan kemungkinan besar Windows), file temp yang dibuat oleh pipa. Tidak * nix, tapi tidak ada bedanya.
Jeremy J Starcher
Saya cukup yakin ini tidak benar. Monitor Proses melaporkan tidak ada CreateFileatau WriteFilepanggilan untuk mendukung klaim Anda. / edit: Itu untuk bagian Windows, tentu saja.
Daniel B
3

Benar-benar jika Anda ingin tahu apa yang dilakukan pipa dan perbedaan antara> dan |, lalu buka direktori dengan banyak file, dan

dari terminal ls vs ls | more (atau melakukan itu dari Windows dengan DIR dan DIR | MORE)

Jika Anda menggunakan lebih banyak, Anda akan melihatnya membuat file yang disebut 'lebih' daripada mengirim output ls ke perintah 'lebih'. Jadi jika seseorang melakukan lebih dari itu mungkin kesalahan, seseorang tidak akan melakukan lebih> Anda akan melakukan> file1. Lebih banyak adalah perintah yang terkenal.

<Like the> juga untuk menautkan perintah dan file, bukan perintah ke perintah. Tetapi ketika> mengirimkan output dari sebuah perintah ke file, <mengirimkan file sebagai input ke sebuah perintah. Saya jarang menggunakan <karena saya biasanya menggunakan cat file1 | untuk mengirim output file ke perintah.

$ grep a <file1 abc

$ cat file1 | grep a abc

grep dengan 2 parameter berupa file pola grep. grep dengan satu parameter adalah pola grep. Dan Anda dapat mengirimnya file dengan memiparkan konten file ke sana, atau dengan menggunakan <. Jika menggunakan <, Anda menulis nama perintah terlebih dahulu, kemudian nama file setelah jadi perintah <file. Jika menggunakan | untuk mem-pipe konten file, Anda menggunakan cat file1 | perintah.

Juga banyak perintah mengambil file sebagai input tetap jadi grep file1 akan berfungsi, sama seperti cat file1 | grep a, dan grep a <file1.

Saya melakukan pipe (|) dan> di DOS bahkan 15 tahun yang lalu.

Untuk meringkas caranya | berbeda dari <dan> - Pipa berada di antara 2 perintah. <dan> duduk di antara perintah dan file. > Adalah keluaran ke file. <Adalah input dari file.

barlop
sumber
3

Karakter pipa ( |) menghubungkan output dari satu program ke input yang lain.

Dalam contoh ini echomencetak kata hello, dan wc -cmenghitung karakter inputnya:

echo hello | wc -c
bbaassssiiee
sumber
Saya pikir Anda harus segera mengatakan bahwa gema akan menghasilkan "halo \ n". Anda tidak memberi tahu OP untuk belajar, Anda mengatakan ini kepada semua orang yang membaca jawaban Anda. Mengapa melipatgandakan waktu ini?
Rodrigo
Terima kasih atas umpan baliknya, saya mempersingkat jawaban saya.
bbaassssiiee
2

Untuk memahami ini, cobalah sendiri:

sort -r

Sekarang Anda menggantung dengan kursor, dan itu tidak melakukan apa-apa. Apa yang terjadi jika Anda mengetikkan beberapa data?

1
2
3
5
4

Masih tidak ada apa-apa, kan? Sekarang tekan ctrl + D

5
4
3
2
1

Jadi apa yang dilakukan adalah, dibutuhkan input (apa yang Anda ketikkan), lakukan sesuatu dengannya (macam) dan berikan kembali sebagai output. The lsperintah tidak mengambil input, hanya menghasilkan output. Simbol pipa mengambil output dari ls, dan mengumpankannya sebagai input ke sortperintah.

>tidak mengumpankan output ke program, tetapi menyimpan output sebagai file. <menggunakan file sebagai input.

jornane
sumber