2016-08-11 7 views
0

私は人生を楽にするために小さなBashスクリプトを作った。しかし私は解決できない問題に遭遇しました。出力が早すぎる

私は
たい私は、ファイル内のphp-エラーのためにファイルが変更/保存されることを毎回チェックする小さなスクリプトを作りました。これは私が毎回コマンドを実行する必要なしに行われます。だから、私は第2の画面でBashスクリプトを一度実行し、PHPのファイルを画面1に保存するたびに実行します。最終的なエラーは画面2に自動的に表示されます。

基本アルゴリズム

  1. はそれにそれを比較ファイルのハッシュは、それが異なる場合は、ファイルを保存/変更された前回のハッシュ
  2. のget:使用してエラーがあるかどうかをチェックphp -lコマンド
  3. 結果をphp -lから
から出力します。

問題: php -lからの結果は、コードが要求する前に印刷されます。

コード

#!/bin/bash 

#Declaring basic variables here 
fileToCheck="$1" 

oldHash=("") 
checksum=("") 

#Function to get a striped line as long as the terminal width 
function lineAmount { 
    cwidth=`tput cols` 
    lines="" 
    for i in $(seq $(expr $cwidth - 33)); do lines="$lines-";done 
    echo $lines 
} 


#Function to show the actual error 
function showError { 
    msg=$1 
    time=`date +"%c"` 
    l=$(lineAmount) 

    if [ "$msg" == "No" ] 
     then 
      msg="No errors detected." 
    fi 

    printf "\n\n$time $l \n$msg\n" 
} 

#Start-screen------------------------------------------------ 
printf "Starting session for $1 at $time \n$(lineAmount)\n" 
if [ ! -f $1 ] 
    then 
     echo "[Error] File $1 not found." 
     exit 
fi 
printf "\n\n\n" 
#------------------------------------------ 

#Printing out error when file changed 
while true 
    do 
     sleep 0.6 
     checksum=($(sha256sum $fileToCheck)) 
     checksum=${checksum[0]} 

     if [ "$checksum" != "$oldHash" ] 
      then 
       error=$(php -l $fileToCheck) 
       oldHash=$checksum 

       showError $error 
     fi 
done 

テストファイル(test.phpを):スクリプトの

<?php 
    function foo() { 

    } 
?> 

出力:

Starting session for /home/name/Desktop/test.php at 
----------------------------------------------- 





Thu 11 Aug 2016 08:16:15 PM CEST ----------------------------------------------- 
No errors detected. 

今、中もちろん、この意志はエラーを与える

<?php 
    function foo() { 


?> 

、そして私のスクリプトは、そのエラーを示しています:test.phpを私は4行目を削除

Starting session for /home/name/Desktop/test.php at 
----------------------------------------------- 





Thu 11 Aug 2016 08:16:15 PM CEST ----------------------------------------------- 
No errors detected. 
PHP Parse error: syntax error, unexpected end of file in /home/name/Desktop/test.php on line 6 


Thu 11 Aug 2016 08:19:37 PM CEST ---------------------------------------------------------------------------------- 
Parse 

しかし、あなたが見ることができるように、これは素晴らしいではありません出力。 PHP Parse error: syntax error, unexpected end of file in /home/name/Desktop/test.php on line 6は、2番目の点線の下に印刷する必要があります。 「エラーが見つかりません」以下ではありません。 (最初の出力)。

予想される出力:

Starting session for /home/name/Desktop/test.php at 
----------------------------------------------- 





Thu 11 Aug 2016 08:16:15 PM CEST ----------------------------------------------- 
No errors detected. 


Thu 11 Aug 2016 08:19:37 PM CEST ---------------------------------------------------------------------------------- 
PHP Parse error: syntax error, unexpected end of file in /home/name/Desktop/test.php on line 6 

私は、私のアルゴリズムビットを変更しようとした多くを探索し、多くのことを試してみました。それは動作していません。 問題は、51行目、または29行目のどこかにあると思います。しかし、何が間違っているのかは分かりません。

ありがとうございます!ここで

+0

あなたはどのようにPHPファイルを編集していますか?あなたのエディタはおそらくあなたのために自動保存していますか? –

+0

@EricRenouf私はVimを使用しています。私は:w関数で保存しています。私が知る限り自動保存機能はありません。また、Linux Mintのデフォルトのテキストエディタで試したところ、同じ結果が得られました。 –

答えて

4

はあなたの問題のストリップダウンし、簡易版です:

Why does this print an error message immediately instead of assigning it to the variable?

$ error=$(php -l test.php) 
PHP Parse error: syntax error, unexpected end of file in test.php on line 5 

php -lプリントのエラーメッセージが良いUnixの市民のようにstderrにすべきです。 $(..)はstdoutだけをキャプチャします。

あなたが一緒にstdoutとstderrをキャプチャしたい場合は、あなたが使用することができます。

error=$(php -l $fileToCheck 2>&1) 

あなたが現在ほとんどを捨てているので、メッセージは、単一のパラメータとして渡されるように、あなたはまた、あなたの変数を引用する必要がありますそれを(shellcheckが便利です):

良い市民であること
showError "$error" 

phpも有用な終了コードを返すので、代わりにそれが成功したなら、あなただけのステータスを確認することができます見て、「いいえ」と一致しようとしているの直接:

if error=$(php -l $fileToCheck 2>&1) 
then 
    echo "No problems" 
else 
    echo "It failed with these messages: $error" 
fi 
+0

あなたの助けとヒントありがとう!今は完璧に動作しています。しかし、 '2>&1'の部分をもう少し詳しく説明できますか? –

+1

http://stackoverflow.com/questions/818255/in-the-shell-what-does-21-mean –

関連する問題