Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 我该如何使if语句识别grep为真或假?_Bash_Git_Grep - Fatal编程技术网

Bash 我该如何使if语句识别grep为真或假?

Bash 我该如何使if语句识别grep为真或假?,bash,git,grep,Bash,Git,Grep,我目前正在尝试编写一个快速bash脚本来更新文件夹中的所有项目。我正试图这样做: badCount=0 projectCount=0 manual_projects[badCount]="leave_empty" badCount=$((badCount+1)) for project in */ do echo '' projectCount=$((projectCount+1)) cd "$project" echo

我目前正在尝试编写一个快速bash脚本来更新文件夹中的所有项目。我正试图这样做:

badCount=0
projectCount=0
manual_projects[badCount]="leave_empty"
badCount=$((badCount+1))

for project in */
do
    echo ''
    projectCount=$((projectCount+1))
    cd "$project"
    echo "$project"
    git fetch
    git checkout build | grep awudgawu
    if (git pull | grep -qw error); then
        manual_projects[$badCount]=$project
        badCount=$((badCount+1))
    fi
    cd ../
done
出于某种原因,它从不在if条件下运行,即使有项目从中输出错误。为什么我的情况总是导致错误?如果在pull请求中有“error”一词,如何使其返回true?

首先 您遇到的问题来自这样一个事实,
|grep
序列只查看标准输出(stdout),而错误消息来自标准错误(stderr)

玩具示例(不要尝试,因为有一个
git rm…
!):

$git rm'*'
$git pull | grep请
→ “不起作用”
$git pull 2>&1 |请出示grep
→ 合并前请提交更改或将其隐藏。
下一个 问题是,您真的确定要依赖于
grep

因为这似乎是一项棘手的工作,试图通过对git命令的结果执行
grep
来检测错误。事实上,不能保证
错误
单词本身会成为错误消息的一部分

(此外,还有一个与管道出口状态相关的微妙之处,例如,
false | true;echo$?

实际上,所谓的退出状态(也称为错误代码)可以直接使用(
$?
),或者借助
if-then-else

例如:

$false
$echo$?
→ 1.
$true
$echo$?
→ 0
如果错误,则为$;然后回音ok;艾尔塞科;fi
→ 让开
$if git拉取不存在的远程设备;然后
回声ok
其他的
高雅高
fi
相关工具 您试图创建的脚本让我想到了Joey Hess开发的以下工具:(另请参见)

免责声明:我自己不是
myrepos
用户,但我想您可能有兴趣尝试一下,因为它是专门设计用来管理存储在给定文件夹中的许多存储库的…

首先 您遇到的问题来自这样一个事实,
|grep
序列只查看标准输出(stdout),而错误消息来自标准错误(stderr)

玩具示例(不要尝试,因为有一个
git rm…
!):

$git rm'*'
$git pull | grep请
→ “不起作用”
$git pull 2>&1 |请出示grep
→ 合并前请提交更改或将其隐藏。
下一个 问题是,您真的确定要依赖于
grep

因为这似乎是一项棘手的工作,试图通过对git命令的结果执行
grep
来检测错误。事实上,不能保证
错误
单词本身会成为错误消息的一部分

(此外,还有一个与管道出口状态相关的微妙之处,例如,
false | true;echo$?

实际上,所谓的退出状态(也称为错误代码)可以直接使用(
$?
),或者借助
if-then-else

例如:

$false
$echo$?
→ 1.
$true
$echo$?
→ 0
如果错误,则为$;然后回音ok;艾尔塞科;fi
→ 让开
$if git拉取不存在的远程设备;然后
回声ok
其他的
高雅高
fi
相关工具 您试图创建的脚本让我想到了Joey Hess开发的以下工具:(另请参见)


免责声明:我自己不是
myrepos
用户,但我想您可能有兴趣尝试一下,因为它是专门设计用来管理存储在给定文件夹中的许多存储库的…

使用bash-x调试脚本。使用bash-x调试脚本。您的链接看起来像我们正在尝试的是的,非常好的资源,谢谢。我的重点是,如果我可以拉,并得到一个错误,比如“你需要先提交你的更改”,我如何用grep解释这个问题?(或任何其他方式)@NathanielCutajar好的(因此我相应地扩展了我的答案:)做得好,这是一个非常详细的解释。正如您所指出的,执行
if(git pull)
会检查输出是否良好。添加
使其在失败时进入if语句。非常感谢@NathanielCutajar不要用括号
if(git-pull)
if-git-pull
慢,因为它生成了一个额外的子shell;这也意味着,如果您正在调用类似shell函数的东西,则会阻止它在父shell中设置变量、更改其工作目录等;有时,您希望将shell函数隔离到可以更改自己的目录或重写文件描述符而不影响父进程的位置。我有时也看到人们试图用花括号来分组,但一般来说,花括号在这种情况下更有意义<代码>如果{git pull;};然后在不强制使用额外的子shell的情况下为您提供清晰的视觉效果。您的链接看起来就像我们要做的是的,非常好的资源,谢谢。我的重点是,如果我可以拉,并得到一个错误,比如“你需要先提交你的更改”,我如何用grep解释这个问题?(或任何其他方式)@NathanielCutajar好的(因此我相应地扩展了我的答案:)做得好,这是一个非常详细的解释。正如您所指出的,执行
if(git pull)
会检查输出是否良好。添加
使其在失败时进入if语句。非常感谢@NathanielCutajar不要用括号
if(git-pull)
if-git-pull
慢,因为它生成了一个额外的子shell;这也意味着,如果您正在调用类似shell函数的东西,则会阻止它在父shell中设置变量、更改其工作目录等;有时,您希望将shell函数隔离到它可以更改自己的目录或重写文件描述符而不影响pare的位置