出力をshスクリプトにパイプし、コマンドにパイプする方法は?

出力をshスクリプトにパイプし、コマンドにパイプする方法は?

私はこれをインターネットで検索してスタックを検索しましたが、正確に私がやろうとしていることを見つけることができませんでした。私はまだこの問題を本当に理解できません。

したがって、gzipを囲むラッパーであるshスクリプトがあるとします(たとえば)。コマンドラインからmysqldump何か(例:)の出力を私のスクリプトにパイプしたいと思います。その後、スクリプトは入力を取得してgzipにパイプする必要があります。

コマンドラインの例:

mysqldump somedb | mysqldump somedb | myscript > somefile.dmp.gz

myscriptの例(私が試したこと):

#!/usr/bin/env sh
read inp
command="echo \"$inp\" | gzip"
eval $command

この例には多くの問題がある可能性があります。助けてください? :)

ソリューション(他の人が見つけることができます)

以下の説明のおかげで、SHスクリプト内でコマンドを実行すると、コマンドを直接実行するときと同様に、入力がスクリプトにパイプされることがわかりました。

したがって、この場合:

catファイル|圧縮パッケージ

以下とまったく同じことを行います。

私のスクリプト:

#!/usr/bin/env sh
gzip

猫ファイル./myscript

したがって、私の場合は別の問題があることを指摘したいと思います。実際のスクリプトでは、次のように読み込み、入力ストリームが存在するかどうかを確認します。

read inp
if [ -z "$inp" ]; then
    echo "No input"
    exit;
fi

read inpその後、入力パイプが空であることがわかりました。

答え1

#!/bin/sh
gzip -c

十分です。

$ mysqldump ... | ./script >out.gz

gzip -c標準入力から圧縮されていないデータを読み取り、標準出力に圧縮データを書き込みます。

標準入力はパイプを介して提供され、標準出力はファイルにリダイレクトされます。パイプとリダイレクトは呼び出しシェルで処理されます。

sedコマンドラインで式を使用し、その式に基づいて入力を変換したり、式が使用されていない場合にデータを渡す少し複雑な例は次のとおりです。

#!/bin/sh

if [ -n "$1" ]; then
    sed -e "$1"
else
    cat
fi

(ここでは、sed -e ""同じ効果がありますが、catより複雑な例を望んでいました)

$ utility | ./script "1,5d" >out

...出力の最初の5行が削除されますutility

答え2

簡単な例を使って複雑な状況を説明しようとしているので、スクリプトのどの部分が単純な誤解であり、どの部分が複雑なのかわかりません。

もしそうなら、これはあなたの質問の要件を満たすでしょう。

#!/bin/sh
gzip "$@"

答え3

を使用して空であることを確認するために一部の入力を読み取るには、変数にバイト値を格納できるようなシェルをread使用する必要があります。たとえば、次のようになります。zsh

#! /bin/zsh -
if LC_ALL=C read -ru0 -k1 byte; then
  # one byte was read, the input is not empty
  (printf %s "$byte"; cat) | gzip
else
  echo >&2 No input
fi

または、次のエンコード形式を使用してください。

#! /bin/sh -
# get the value of the first byte as octal:
byte=$(od -An -N1 -vto1 | tr -cd 0-7)

if [ -n "$byte" ]; then
  (printf "\\$byte"; cat) | gzip
else
  echo >&2 No input
fi

関連情報