GNU/Linux >> Linux の 問題 >  >> Linux

出力を bash 関数にパイプする

そのような bash 関数に直接パイプすることはできませんが、 read を使用できます 代わりに引き込みます:

jc_hms() {
  while read -r data; do
      printf "%s" "$data"
  done
}

あなたが望むものであるべきです


実際の質問に答えるために、シェル関数がパイプの受信側にある場合、標準入力は all によって継承されます ただし、実際に標準入力から読み取るコマンドのみがデータを消費します。次々に実行されるコマンドの場合、後のコマンドは、前のコマンドによって消費されなかったものだけを見ることができます。 2 つのコマンドが並行して実行される場合、どのコマンドがどのデータを参照するかは、OS がコマンドをスケジュールする方法によって異なります。

printf以降 が関数内の最初で唯一のコマンドである場合、標準入力は事実上無視されます。 read を使用するなど、いくつかの方法があります。 printf に渡すことができる変数に標準入力を読み込むための組み込み :

jc_hms () {
    read foo
    hr=$(($foo / 3600))
    min=$(($foo / 60))
    sec=$(($foo % 60))
    printf "%d:%02d:%02d" "$hr" "$min" "$sec"
}

ただし、パイプラインの必要性は、awk を使用する必要性に依存しているようです。 、次の代替案を提案させてください:

printstring=$( jc_hms $songtime )

songtime以降 スペースで区切られた数字のペアで構成され、シェルは songtime の値で単語分割を実行します 、および jc_hms 2 つの個別のパラメーターが表示されます。 jc_hms の定義を変更する必要はありません。 であり、標準入力経由で何かをパイプする必要はありません。

それでも jc_hms の別の理由がある場合 標準入力を読み取るには、お知らせください。


1) 私はこれがかなり古い記事であることを知っています

2) ここにある回答のほとんどが気に入っています

しかし、似たようなものが必要だったので、この投稿を見つけました。 stdin を使用する必要があることに誰もが同意していますが、ここでの回答に欠けているのは、/dev/stdin ファイルの実際の使用法です。

read ビルトインを使用すると、この関数をパイプ入力で使用することが強制されるため、通常の方法では使用できなくなります。 /dev/stdin を利用することは、この問題を解決する優れた方法だと思うので、完全を期すために 2 セント追加したいと思います.

私の解決策:

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;
}

実際:

[email protected]:pwd$ jc_hms 7800
02:10:00
[email protected]:pwd$ echo 7800 | jc_hms 
02:10:00

これが誰かの役に立てば幸いです。

ハッピー ハッキング!


または、簡単な方法で行うこともできます。

jc_hms() {
    cat
}

これまでのすべての回答は、これがOPが望んでいたものではないという事実を無視していますが(彼は機能が単純化されていると述べました)


Linux
  1. 条件付きでパイプステージをBashスクリプトに含めますか?

  2. コマンドの出力をBashを使用して列ごとに分割しますか?

  3. Bashスクリプトで1行ずつ読む

  1. awk の bash キャプチャ出力を配列に

  2. パイプ出力位置を指定

  3. この bash パイプ構造を使用するとデータが失われるように見えるのはなぜですか?

  1. リダイレクトとパイプ出力?

  2. シェル変数の関数?

  3. ダウンロードしたファイルをbashの標準出力にパイプするにはどうすればよいですか?