web-dev-qa-db-ja.com

データをコマンドラインPHPにパイプしますか?

Unixパイプを使用してデータをコマンドラインphpスクリプトにパイプすることは可能ですか?私はもう試した

$> data | php script.php

しかし、期待されたdata$argvに表示されませんでした。これを行う方法はありますか?

24
user151841

私が理解しているように、$argvは、プログラムの引数を表示します。言い換えると、

php script.php arg1 arg2 arg3

ただし、データをPHPにパイプする場合は、標準入力からデータを読み取る必要があります。私はこれを試したことがありませんが、次のようなものだと思います。

$fp = readfile("php://stdin");
// read $fp as if it were a file
22
Gustav Larsson

PHPは標準入力から読み取ることができ、そのための優れたショートカットも提供します: STDIN

これを使用すると、 _stream_get_contents_ などを使用して次のようなことができます。

_$data = stream_get_contents(STDIN);
_

これにより、パイプされたすべてのデータが_$data_にダンプされます。

すべてのデータが読み取られる前に処理を開始する場合、または入力サイズが大きすぎて変数に収まらない場合は、次を使用できます。

_while(!feof(STDIN)){
    $line = fgets(STDIN);
}
_

STDIN$fh = fopen("php://stdin", "r");のショートカットです。同じ方法をファイルの読み取りと書き込み、およびtcpストリームに適用できます。

39
hawken

dataが同じようなものである場合は、-Fまたは-Rフラグを使用することもできます(-Fはそれに続くファイルを読み取って実行し、-Rは文字通り実行します)これらのフラグを使用すると、パイプインされたものは、(通常の)グローバル変数$ argnに表示されます

簡単な例:

echo "hello world" | php -R 'echo str_replace("world","stackoverflow", $argn);'
18
giblfiz

はい、データをパイプで送ることができます。ただし、_$argv_には表示されません。 stdinに移動します。これは、fopen('php://stdin','r')を含むいくつかの方法で読むことができます。

良い例があります マニュアルに

4
Frank Farmer

これは私のために働いた:

stream_get_contents(fopen("php://stdin", "r"));
4
klokop

シェルスクリプトのように動作し、入力の各行に対して別のコマンドを実行するスクリプトを作成しようとしているこの投稿に出くわしました...例:

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

$argvに表示したい場合は、次のことを試してください。

echo "Whatever you want" | xargs php script.php

これは、コマンドライン引数への標準入力に入るすべてのものを隠蔽します。

2
user914330

最良のオプションは、-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(){...}

0
Nadir

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

これがお役に立てば幸いです。これにより、さらに多くのことができるようになります。

0