Bash 输出过早显示

Bash 输出过早显示,bash,printf,echo,Bash,Printf,Echo,我制作了一个小的Bash脚本,让我的生活更轻松。但是我遇到了一个我无法解决的问题 我想要什么 我制作了一个小脚本,每次保存/更改文件时都会检查文件中的php错误。这是在我每次都不需要运行命令的情况下完成的。因此,我在第二个屏幕上运行Bash脚本一次,而不是每次在第一个屏幕上保存PHP文件时都运行Bash脚本;我自动获得屏幕2上显示的最终错误 基本算法 获取文件的哈希值 将其与以前的哈希进行比较 如果不同,则更改/保存文件:使用php-l命令检查是否有错误 从php-l 问题: php-l的结果会

我制作了一个小的Bash脚本,让我的生活更轻松。但是我遇到了一个我无法解决的问题

我想要什么
我制作了一个小脚本,每次保存/更改文件时都会检查文件中的php错误。这是在我每次都不需要运行命令的情况下完成的。因此,我在第二个屏幕上运行Bash脚本一次,而不是每次在第一个屏幕上保存PHP文件时都运行Bash脚本;我自动获得屏幕2上显示的最终错误

基本算法

  • 获取文件的哈希值
  • 将其与以前的哈希进行比较
  • 如果不同,则更改/保存文件:使用
    php-l
    命令检查是否有错误
  • 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.
    
    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
    
    现在,在test.php中,我删除了第4行:

    <?php
        function foo() {
    
    
    ?>
    
    但正如您所看到的,这不是一个好的输出。
    PHP解析错误:语法错误,第6行/home/name/Desktop/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.
    
    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行。但我真的看不出有什么不对


    谢谢

    以下是您的问题的简化版本:

    为什么会立即打印错误消息,而不是将其分配给变量


    php-l
    将错误消息打印到stderr,就像一个好的Unix公民应该做的那样<代码>$(..)
    仅捕获标准输出

    如果要同时捕获stdout和stderr,可以使用:

    error=$(php -l $fileToCheck 2>&1)
    
    您还应该引用变量,以便将消息作为单个参数传递,因为您目前正在丢弃大部分变量(这很有帮助):

    作为一个好公民,
    php
    也会返回一个有用的退出代码,因此,您可以直接检查状态,而不是尝试匹配“否”以查看是否成功:

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

    以下是您的问题的简化版本:

    为什么会立即打印错误消息,而不是将其分配给变量


    php-l
    将错误消息打印到stderr,就像一个好的Unix公民应该做的那样<代码>$(..)仅捕获标准输出

    如果要同时捕获stdout和stderr,可以使用:

    error=$(php -l $fileToCheck 2>&1)
    
    您还应该引用变量,以便将消息作为单个参数传递,因为您目前正在丢弃大部分变量(这很有帮助):

    作为一个好公民,
    php
    也会返回一个有用的退出代码,因此,您可以直接检查状态,而不是尝试匹配“否”以查看是否成功:

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

    如何编辑php文件?您的编辑器可能会自动为您保存吗?@EricRenouf我使用的是Vim,我使用的是:w函数保存。据我所知,没有自动保存功能。我还在LinuxMint上使用默认文本编辑器进行了尝试,得到了相同的结果?您的编辑器可能会自动为您保存吗?@EricRenouf我使用的是Vim,我使用的是:w函数保存。据我所知,没有自动保存功能。我还在LinuxMint上用默认的文本编辑器进行了尝试,得到了同样的结果。谢谢你的帮助和提示!它现在工作得很好。不过,您能再解释一下
    2>&1
    部分吗?谢谢您的帮助和提示!它现在工作得很好。不过,你能再解释一下
    2>&1
    部分吗?