誰がファイルの最初の記号を置き換えるプロセスを中断し、その理由は何ですか?

誰がファイルの最初の記号を置き換えるプロセスを中断し、その理由は何ですか?
$ type 1.sh
#!/bin/bash -eu
php <(echo 12)
$ ./1.sh
2

$ type 2.sh
#!/bin/bash -eu
cat <(echo 12)
$ ./2.sh
12

$ type 3.sh
#!/bin/bash -eu
echo 12 | php
$ ./3.sh
12

$ type 4.sh
#!/bin/bash -eu
rm -f named_pipe
mknod named_pipe p
echo 12 > named_pipe
$ ./4.sh
$ php named_pipe   # from another window
2

Debianphp-5.4.14bash-4.1.5)、Arch Linuxphp-5.4.12、)bash-4.2.42についてテストしました。

ベストアンサー1

もちろんPHPです。パイプはファイルの最初の文字を食べません。 PHPはすべての文字を読みますが、最初の文字を出力しません。これまで、問題が入力にあるのか出力にあるのかはわかりません。 PHPが何らかの理由で最初の文字を出力しない可能性があります。

いくつかの実験は実際に入力に問題があることを示しました。

$ php <(echo '<?php echo "hello" ?>') 
?php echo "hello" ?>
$ php <(echo ' <?php echo "hello" ?>')
hello$ 

PHPは、スクリプトがファイル名として提供されている場合にのみ(コマンドライン引数がなく、スクリプトがstdinから読み取られない場合)、スクリプトファイルがパイプまたは他のものである場合にのみ、スクリプトの最初の文字を食べます。スクリプトファイルは検索可能です(通常のファイルなど)。

何が起こるかは、最初に通常のPHPパーサーが起動する前に、コマンドラインハンドラがスクリプトが次に起動することを確認することです。シェルボーンワイヤー。スクリプトが2文字で始まる場合、#!PHPは最初の行をスキップします。これにより、次のようなPHPスクリプトを作成できます。

#!/usr/bin/php
first line
<?php echo "second line"?>

スクリプトが出力されます。

first line
second line

#!/usr/bin/phpそしてそもそも偽りはなかった。

Shebang検出器は次のように動作します。

  • 最初の文字を読みます。
  • 最初の文字がある場合は、#他の文字を読みます。
  • 最初の2文字がある場合は、#!最初の改行文字まで読み続けます。
  • 最初の2文字でない場合は、#!ファイルの先頭に巻き戻します。
  • 一般的なPHPの解析を開始します。

スクリプトファイルが見つからないと、巻き戻しステップは失敗しますが、PHPはそれを検出しないため、ファイルの最初の文字が失われます(最初の文字がaの場合、2番目の文字も失われます#)。 。これはPHPコマンドラインソルバーのバグです。

あなたは見ることができますパスワード自分のために(関数からcli_seek_file_begin)。

おすすめ記事