GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana Cara Menentukan Bagian Pipa yang Sepenuhnya "melewati"?

Saya memiliki skrip di mana data diproses dengan mengalirkannya melalui pipa yang cukup besar. Beberapa bagian dari pipeline sebenarnya adalah fungsi “switchboard” yang melakukan hal berbeda berdasarkan beberapa parameter eksternal. Contoh yang dibuat-buat diberikan di bawah ini.

#! /bin/bash

switchboard() {
    # Select the appropriate command depending on input.
    case "$1" in
        1)
            sort
            ;;
        2)
            awk '{ print $5 }' | sort
            ;;
        *)
            cat  # <= Is there something more optimal here?
            ;;
    esac
}

# The data processing pipeline.
<"$1" tr '[:upper:]' '[:lower:]' | switchboard "$2" | head -n 10

Dalam fungsi “switchboard”, fallback hanya menggunakan cat untuk mengirim input langsung ke output. Ini berfungsi dengan baik, tetapi dalam saluran saya, saya mungkin memiliki banyak "switchboard" dan saya ingin menghindari membuat sekelompok cat yang tidak melakukan apa-apa proses jika memungkinkan.

Apakah ada semacam bash built-in (atau alternatif) yang dapat digunakan untuk menentukan bahwa bagian tertentu dari pipa harus menghubungkan STDOUT langsung ke STDIN tanpa harus menggunakan subproses? (Saya mencoba : tapi itu hanya memakan datanya) Atau, apakah cat menggunakan sedikit sumber daya sehingga ini bukan masalah?

Jawaban yang Diterima:

Pertama, penggunaan lagi cat tidak membuat banyak perbedaan, dan Anda tidak perlu mempermasalahkannya.

Kedua, perintah yang membentuk pipeline tetap dijalankan dalam proses terpisah, tidak peduli apakah itu perintah eksternal atau bawaan:

$ a=0
$ a=1 | a=2 | a=3
$ echo $a
0

Mengenai masalah Anda yang sebenarnya, tidak mungkin hanya menghubungkan 'stdin' ke 'stdout'; bahkan jika shell memiliki beberapa nop builtin yang akan runtuh saat digunakan dalam pipa (misalnya | nop | -> | ), Shell tidak memiliki cara untuk mengetahui sebelumnya, pada saat ia menyiapkan pipa, bahwa "switchboard" Anda akan beralih ke nop bukannya awk atau sort .

Anda juga dapat mencapai efek yang sama seperti Anda "switchboards" dengan membangun pipa sendiri, dan kemudian memanggil eval untuk menjalankannya. Contoh:

$ cat test.shtype=`file -zi "$1"`case $type in*application/gzip*) mycat='zcat "$1"';;*) mycat='cat "$1"';;esaccase $type in*charset=utf-16le*) mycat="$mycat | iconv -f utf16le";;esac# sorot komentar di blueesc=`printf '
Linux
  1. Cara Memodifikasi File Di Tempat?

  2. Apakah Kami Memiliki Undo Di Linux?

  3. Cara Untuk 'ekor -f' Folder??

  1. header file ELF

  2. Menambahkan bagian ke file ELF

  3. Apakah ada cara untuk me-restart badblock?

  1. Apakah ada cara untuk mendengarkan proses?

  2. Tentukan posisi keluaran pipa

  3. Cara tercepat untuk mengekstrak tar.gz