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 '
Apakah>&- Lebih Efisien Daripada>/dev/null?
Uji Pencarian Dan Ganti Sed Rekursif Sebelum Menjalankan?
Linux