Unixパイプを使用してデータをコマンドラインphpスクリプトにパイプすることは可能ですか?私はもう試した
$> data | php script.php
しかし、期待されたdata
は$argv
に表示されませんでした。これを行う方法はありますか?
私が理解しているように、$argv
は、プログラムの引数を表示します。言い換えると、
php script.php arg1 arg2 arg3
ただし、データをPHPにパイプする場合は、標準入力からデータを読み取る必要があります。私はこれを試したことがありませんが、次のようなものだと思います。
$fp = readfile("php://stdin");
// read $fp as if it were a file
PHPは標準入力から読み取ることができ、そのための優れたショートカットも提供します: STDIN
。
これを使用すると、 _stream_get_contents
_ などを使用して次のようなことができます。
_$data = stream_get_contents(STDIN);
_
これにより、パイプされたすべてのデータが_$data
_にダンプされます。
すべてのデータが読み取られる前に処理を開始する場合、または入力サイズが大きすぎて変数に収まらない場合は、次を使用できます。
_while(!feof(STDIN)){
$line = fgets(STDIN);
}
_
STDIN
は$fh = fopen("php://stdin", "r");
のショートカットです。同じ方法をファイルの読み取りと書き込み、およびtcpストリームに適用できます。
data
が同じようなものである場合は、-Fまたは-Rフラグを使用することもできます(-Fはそれに続くファイルを読み取って実行し、-Rは文字通り実行します)これらのフラグを使用すると、パイプインされたものは、(通常の)グローバル変数$ argnに表示されます
簡単な例:
echo "hello world" | php -R 'echo str_replace("world","stackoverflow", $argn);'
はい、データをパイプで送ることができます。ただし、_$argv
_には表示されません。 stdinに移動します。これは、fopen('php://stdin','r')
を含むいくつかの方法で読むことができます。
良い例があります マニュアルに
これは私のために働いた:
stream_get_contents(fopen("php://stdin", "r"));
シェルスクリプトのように動作し、入力の各行に対して別のコマンドを実行するスクリプトを作成しようとしているこの投稿に出くわしました...例:
ls -ln | awk '{print $9}'
同様に動作するphpスクリプトを作成しようとしている場合、これは私にとってはうまくいきました。
#!/usr/bin/php
<?php
$input = stream_get_contents(fopen("php://stdin", "r"));
$lines = explode("\n", $input);
foreach($lines as $line) {
$command = "php next_script.php '" . $line . "'";
$output = Shell_exec($command);
echo $output;
}
$argv
に表示したい場合は、次のことを試してください。
echo "Whatever you want" | xargs php script.php
これは、コマンドライン引数への標準入力に入るすべてのものを隠蔽します。
最良のオプションは、-rオプションを使用して、stdinからデータを取得することです。つまり、PHPを使用してJSONを簡単にデコードするために使用します。このようにして、物理的なスクリプトファイルを作成する必要はありません。
こんなふうになります:
docker inspect $1|php -r '$a=json_decode(stream_get_contents(STDIN),true);echo str_replace(["Array",":"],["Shares"," --> "],print_r($a[0]["HostConfig"]["Binds"],true));'
このコードは、ホストとコンテナの間の共有フォルダを表示します。 $ 1をコンテナ名に置き換えるか、次のようなbashエイリアスに配置してくださいdisplayshares(){...}
CSVファイルを取得してTSVファイルに変換する必要がありました。確かに、ファイルをExcelにインポートしてから再エクスポートすることはできますが、データをコンバーターにパイプするときは、コマンドラインにとどまって簡単に作業を完了できるという点で楽しいところです。
だから、私のスクリプト(csv2tsv
と呼ばれる)は
#!/usr/bin/php
<?php
while(!feof(STDIN)){
echo implode("\t", str_getcsv(fgets(STDIN))), PHP_EOL;
}
私はchmod +x csv2tsv
。
その後、cat data.csv | csv2tsv > data.tsv
で実行でき、TSVとしてデータを取得できます。
OK。エラーチェック(データは実際のCSVファイルですか?)などはありませんが、原則はうまく機能します。
そしてもちろん、必要な数のコマンドをチェーンすることができます。
このアイデアをさらに拡張したい場合は、コマンドに追加のオプションを含める機能はどうでしょうか。
シンプル!
#!/usr/bin/php
<?php
$separator = $argv[1] ?? "\t";
while(!feof(STDIN)){
echo implode($separator, str_getcsv(fgets(STDIN))), PHP_EOL;
}
これで、デフォルトのセパレータをタブから別のものに上書きできます。 |
多分!
cat data.csv | csv2tsv '|' > data.psv
これがお役に立てば幸いです。これにより、さらに多くのことができるようになります。