GNU/Linux >> Tutoriels Linux >  >> Linux

Canaliser la sortie vers la fonction bash

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)


Linux
  1. Rediriger et canaliser la sortie ?

  2. Fonctions dans les variables shell ?

  3. Inclure conditionnellement une étape Pipe dans un script Bash ?

  4. Diviser la sortie de la commande par colonnes à l'aide de Bash ?

  5. Utilisation de la sortie des commandes précédentes dans bash

Comment lire des fichiers ligne par ligne dans Bash

Bash :Écrire dans un fichier

Commande de lecture bash

Fonctions bash

Comment lire un fichier ligne par ligne dans Bash

Shell Scripting Partie V :Fonctions dans Bash