GNU/Linux >> Znalost Linux >  >> Linux

Výstup potrubí do funkce bash

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á)


Linux
  1. Podmíněně zahrnout fázi potrubí do skriptu Bash?

  2. Bash Beginner Series #9:Použití funkcí v Bash

  3. Rozdělit výstup příkazu podle sloupců pomocí Bash?

  1. Čtěte řádek po řádku v bash skriptu

  2. Bash zachycující výstup awk do pole

  3. Jak převedu stažený soubor na standardní výstup v bash?

  1. Přesměrování a výstup potrubí?

  2. Funkce v proměnných Shell?

  3. Použití výstupu předchozích příkazů v bash