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