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)