GNU/Linux >> Belajar Linux >  >> Linux

Output pipa ke fungsi bash

Anda tidak dapat menyalurkan barang langsung ke fungsi bash seperti itu, namun Anda dapat menggunakan read untuk menariknya sebagai gantinya:

jc_hms() {
  while read -r data; do
      printf "%s" "$data"
  done
}

harus menjadi apa yang Anda inginkan


Untuk menjawab pertanyaan Anda yang sebenarnya, ketika fungsi shell berada di ujung penerima pipa, input standar diwarisi oleh semua perintah dalam fungsi, tetapi hanya perintah yang benar-benar membaca dari input standarnya yang menggunakan data apa pun. Untuk perintah yang dijalankan satu per satu, perintah selanjutnya hanya dapat melihat apa yang tidak digunakan oleh perintah sebelumnya. Saat dua perintah dijalankan secara paralel, perintah mana yang melihat data mana bergantung pada cara OS menjadwalkan perintah tersebut.

Sejak printf adalah perintah pertama dan satu-satunya dalam fungsi Anda, input standar diabaikan secara efektif. Ada beberapa cara untuk mengatasinya, termasuk menggunakan read bawaan untuk membaca input standar ke dalam variabel yang dapat diteruskan ke printf :

jc_hms () {
    read foo
    hr=$(($foo / 3600))
    min=$(($foo / 60))
    sec=$(($foo % 60))
    printf "%d:%02d:%02d" "$hr" "$min" "$sec"
}

Namun, karena kebutuhan Anda akan pipeline tampaknya bergantung pada kebutuhan yang Anda rasakan untuk menggunakan awk , izinkan saya menyarankan alternatif berikut:

printstring=$( jc_hms $songtime )

Sejak songtime terdiri dari pasangan angka yang dipisahkan spasi, shell melakukan pemisahan kata pada nilai songtime , dan jc_hms melihat dua parameter terpisah. Ini tidak memerlukan perubahan dalam definisi jc_hms , dan tidak perlu memasukkan apa pun ke dalamnya melalui input standar.

Jika Anda masih memiliki alasan berbeda untuk jc_hms untuk membaca masukan standar, beri tahu kami.


1) Saya tahu ini adalah postingan yang cukup lama

2) Saya suka sebagian besar jawaban di sini

Namun, saya menemukan posting ini karena saya membutuhkan sesuatu yang serupa. Sementara semua orang setuju stdin adalah apa yang perlu digunakan, jawaban yang hilang di sini adalah penggunaan sebenarnya dari file /dev/stdin.

Menggunakan read builtin memaksa fungsi ini untuk digunakan dengan input pipa, sehingga tidak lagi dapat digunakan dengan cara biasa. Menurut saya menggunakan /dev/stdin adalah cara terbaik untuk memecahkan masalah ini, jadi saya ingin menambahkan 2 sen untuk kelengkapan.

Solusi saya:

jc_hms() { 
  declare -i i=${1:-$(</dev/stdin)};
  declare hr=$(($i/3600)) min=$(($i/60%60)) sec=$(($i%60));
  printf "%02d:%02d:%02d\n" $hr $min $sec;
}

Sedang beraksi:

[email protected]:pwd$ jc_hms 7800
02:10:00
[email protected]:pwd$ echo 7800 | jc_hms 
02:10:00

Saya harap ini dapat membantu seseorang.

Selamat meretas!


Atau, Anda juga bisa melakukannya dengan cara sederhana.

jc_hms() {
    cat
}

Meskipun semua jawaban sejauh ini mengabaikan fakta bahwa ini bukan yang diinginkan OP (dia menyatakan fungsinya disederhanakan)


Linux
  1. Redirect Dan Output Pipa?

  2. Fungsi Dalam Variabel Shell?

  3. Pisahkan keluaran perintah dengan kolom menggunakan Bash?

  1. Menggunakan output dari perintah sebelumnya di bash

  2. konversi keluaran bash `ls` ke array json

  3. Tentukan posisi keluaran pipa

  1. Bash Seri Pemula #9:Menggunakan Fungsi di Bash

  2. Mengapa saya sepertinya kehilangan data menggunakan konstruksi pipa bash ini?

  3. Bagaimana cara menyalurkan file yang diunduh ke output standar di bash?