Vous ne pouvez pas diriger des éléments directement vers une fonction bash comme celle-ci, mais vous pouvez utiliser read
pour l'insérer à la place :
jc_hms() {
while read -r data; do
printf "%s" "$data"
done
}
devrait être ce que vous voulez
Pour répondre à votre question, lorsqu'une fonction shell se trouve à l'extrémité réceptrice d'un tube, l'entrée standard est héritée par tous commandes dans la fonction, mais seules les commandes qui lisent réellement à partir de leur entrée standard consomment des données. Pour les commandes qui s'exécutent les unes après les autres, les commandes ultérieures ne peuvent voir que ce qui n'est pas consommé par les commandes précédentes. Lorsque deux commandes s'exécutent en parallèle, quelles commandes voient quelles données dépendent de la façon dont le système d'exploitation planifie les commandes.
Depuis printf
est la première et la seule commande de votre fonction, l'entrée standard est effectivement ignorée. Il y a plusieurs façons de contourner cela, y compris en utilisant le read
intégré pour lire l'entrée standard dans une variable qui peut être passée à printf
:
jc_hms () {
read foo
hr=$(($foo / 3600))
min=$(($foo / 60))
sec=$(($foo % 60))
printf "%d:%02d:%02d" "$hr" "$min" "$sec"
}
Cependant, puisque votre besoin d'un pipeline semble dépendre de votre besoin perçu d'utiliser awk
, permettez-moi de suggérer l'alternative suivante :
printstring=$( jc_hms $songtime )
Depuis songtime
se compose d'une paire de nombres séparés par des espaces, le shell effectue un fractionnement de mots sur la valeur de songtime
, et jc_hms
voit deux paramètres distincts. Cela ne nécessite aucun changement dans la définition de jc_hms
, et pas besoin de diriger quoi que ce soit dedans via l'entrée standard.
Si vous avez toujours une raison différente pour jc_hms
pour lire l'entrée standard, veuillez nous en informer.
1) Je sais que c'est un article assez ancien
2) J'aime la plupart des réponses ici
Cependant, j'ai trouvé ce post parce que j'avais besoin de quelque chose de similaire. Bien que tout le monde s'accorde à dire que stdin doit être utilisé, ce qui manque aux réponses ici, c'est l'utilisation réelle du fichier /dev/stdin.
L'utilisation de la fonction intégrée read force cette fonction à être utilisée avec une entrée canalisée, elle ne peut donc plus être utilisée de manière typique. Je pense qu'utiliser /dev/stdin est un meilleur moyen de résoudre ce problème, donc je voulais ajouter mes 2 cents pour être complet.
Ma solution :
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;
}
En action :
[email protected]:pwd$ jc_hms 7800
02:10:00
[email protected]:pwd$ echo 7800 | jc_hms
02:10:00
J'espère que cela pourra aider quelqu'un.
Bonne piratage !
Ou, vous pouvez aussi le faire de manière simple.
jc_hms() {
cat
}
Bien que toutes les réponses jusqu'à présent aient ignoré le fait que ce n'était pas ce que OP voulait (il a déclaré que la fonction est simplifiée)