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