Nemůžete předávat věci přímo do bash funkce, jako je tato, ale můžete použít read
místo toho jej vtáhněte:
jc_hms() {
while read -r data; do
printf "%s" "$data"
done
}
by mělo být to, co chcete
Abych odpověděl na vaši aktuální otázku, když je funkce shell na přijímacím konci kanálu, standardní vstup zdědí všechny příkazy ve funkci, ale pouze příkazy, které skutečně čtou ze svého standardního vstupu, spotřebovávají jakákoli data. U příkazů, které běží jeden po druhém, mohou pozdější příkazy vidět pouze to, co nebylo spotřebováno předchozími příkazy. Když dva příkazy běží paralelně, které příkazy uvidí, která data závisí na tom, jak OS naplánuje příkazy.
Od printf
je první a jediný příkaz ve vaší funkci, standardní vstup je efektivně ignorován. Existuje několik způsobů, jak to obejít, včetně použití read
vestavěný pro čtení standardního vstupu do proměnné, kterou lze předat printf
:
jc_hms () {
read foo
hr=$(($foo / 3600))
min=$(($foo / 60))
sec=$(($foo % 60))
printf "%d:%02d:%02d" "$hr" "$min" "$sec"
}
Protože se však zdá, že vaše potřeba potrubí závisí na vaší vnímané potřebě použít awk
, dovolte mi navrhnout následující alternativu:
printstring=$( jc_hms $songtime )
Od songtime
skládá se z dvojice čísel oddělených mezerami, shell provádí dělení slov na hodnotě songtime
a jc_hms
vidí dva samostatné parametry. To nevyžaduje žádnou změnu v definici jc_hms
a není potřeba do něj nic přivádět přes standardní vstup.
Pokud máte stále jiný důvod pro jc_hms
chcete-li přečíst standardní vstup, dejte nám prosím vědět.
1) Vím, že toto je docela starý příspěvek
2) Líbí se mi většina odpovědí zde
Tento příspěvek jsem však našel, protože jsem potřeboval něco podobného. I když všichni souhlasí, že stdin je to, co je třeba použít, co zde chybí odpovědi, je skutečné použití souboru /dev/stdin.
Použití vestavěného čtení vynutí použití této funkce se vstupem z potrubí, takže ji již nelze používat typickým způsobem. Myslím, že použití /dev/stdin je lepší způsob řešení tohoto problému, takže jsem chtěl přidat své 2 centy pro úplnost.
Moje řešení:
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;
}
V akci:
[email protected]:pwd$ jc_hms 7800
02:10:00
[email protected]:pwd$ echo 7800 | jc_hms
02:10:00
Doufám, že to někomu pomůže.
Šťastné hackování!
Nebo to můžete udělat také jednoduchým způsobem.
jc_hms() {
cat
}
Ačkoli všechny dosavadní odpovědi ignorovaly skutečnost, že to OP nechtěl (uvedl, že funkce je zjednodušená)