GNU/Linux >> Belajar Linux >  >> Linux

Pergantian Proses:Cara yang Tidak Biasa tetapi Tingkat Lanjut untuk Pengalihan Input/Output di Linux

Anda mungkin sudah familiar dengan input/output dan pengalihan pipa di Linux.

Biarkan saya memberi tahu Anda tentang fitur serupa tetapi canggih yang disebut substitusi proses.

Anda akan menemukan dua jenis sintaks untuk substitusi proses:

<(commands)

atau

>(commands)

Biarkan saya menjelaskan sedikit secara mendetail.

Substitusi Proses Bash

Anda akan menemukan proses substitusi dapat digunakan mirip dengan pengalihan STDOUT atau STDIN.

Dengan <(commands) operator, Anda membaca dari substitusi. Ini berarti bahwa commands diatur untuk menggunakannya sebagai stdout .

Misalnya, perintah berikut menggunakan output ls *sh :

wc -l <(ls *sh)

Ini setara dengan:

ls *sh | wc -l

Dengan >(commands) operator, Anda menulis ke substitusi. Ini berarti bahwa commands diatur untuk menggunakannya sebagai stdin .

Dengan kata lain, ketika Anda memiliki perintah yang mengeluarkan ke file tetapi Anda ingin menulis ke beberapa perintah lain, bukan file.

Berikut adalah contoh yang akan membuat segalanya lebih jelas:

tar -cf >(ssh remote_server tar xf -) .

Anda tahu apa fungsinya? Betul sekali. Anda baru saja mentransfer semua isi direktori saat ini ke server jauh. File arsip dibuat dengan cepat dan diekstraksi di server.

Sejujurnya, >(...) operator kurang umum. Anda akan menemukan bahwa <(...) dapat digunakan lebih sering.

Jadi, apa keuntungan dari substitusi proses jika bekerja seperti pengalihan input output biasa?

Anda akan menyadari kekuatan dan kegunaan substitusi proses bash saat Anda memiliki beberapa jalur pipa perintah untuk digabungkan dalam satu perintah.

Keuntungan dari substitusi proses bash

Penggunaan substitusi proses yang paling jelas dan paling sering adalah perbandingan output dari dua program. Mari saya tunjukkan kepada Anda dengan contoh praktis.

Katakanlah Anda memiliki beberapa file program C dan file objek yang sesuai (.out file) dengan nama yang sama dalam sebuah direktori.

ls *
aa.c aa.out bb.c bb.out cc.c cc.out ...

Inilah tujuan Anda. Anda ingin memeriksa apakah setiap file C memiliki file output yang sesuai dengan nama yang sama dengan file C atau tidak.

Pendekatan tipikal Anda adalah membuat daftar file yang difilter pada ekstensi dan kemudian menggunakan perintah cut dengan pembatas .(dot) untuk mengekstrak nama file tanpa ekstensi:

ls *.c | cut -d. -f1
aa
bb
cc
dd

Pendekatan tipikal Anda adalah menyimpan output file *.c dan *.out ke dalam file sementara dan kemudian membandingkan file-file ini dengan perintah diff. Apakah saya benar?

ls *.c | cut -d. -f1 > c.txt
ls *.out | cut -d. -f1 > out.txt
diff c.txt out.txt
rm c.txt out.txt

Anda dapat menggunakan direktori /tmp untuk membuat file sementara tetapi Anda masih memiliki tiga baris perintah.

Anda dapat dengan indah menggunakan substitusi proses untuk mengganti semua hal di atas dengan satu perintah tanpa membuat file sementara:

diff <(ls *.c | cut -d. -f1) <(ls *.out | cut -d. -f1)

Anda tidak perlu membuat file temp di sini dan itulah kuncinya. Inilah tip saya tentang kapan Anda harus menggunakan substitusi proses.

Setiap kali Anda merasa membutuhkan file sementara untuk melakukan sesuatu, pertimbangkan apakah substitusi proses dapat digunakan.

Substitusi proses adalah fitur bash dan mungkin atau mungkin tidak bekerja dengan shell lain.

Saya harap Anda akan mencoba dan menggunakan proses substitusi di masa mendatang. Seperti yang Anda lihat, ini cukup berguna. Saya menyambut pertanyaan dan saran Anda.


Linux
  1. 5 tips rsync tingkat lanjut untuk sysadmin Linux

  2. Pengalihan Input/Output di Linux/Unix

  3. Linux – Batasi Penggunaan Memori Untuk Proses Linux Tunggal?

  1. Output Dari Perintah Yang Digunakan Untuk Input Ke Cd?

  2. Linux – Referensi Tapi Untuk Linux?

  3. Cara Portabel (posix) Untuk Mencapai Substitusi Proses?

  1. 8 perintah Linux untuk manajemen proses yang efektif

  2. Pelajari Dasar-dasar Cara Kerja Pengalihan I/O (Input/Output) Linux

  3. Bekerja dengan Input Output dan Error Redirection di Linux