我一直假设当 curl 收到 HTTP 500 响应时,它会返回一个退出代码,这意味着失败 (!= 0),但事实并非如此。
如果 HTTP 状态代码不是 200,有没有一种方法可以使 cURL 失败,并且退出代码不同于 0?我知道我可以使用,-w "%{http_code}"但这将它放在 STDOUT 中,而不是作为退出代码(此外,我也对捕获输出感兴趣,我不想重定向到文件,而是重定向到屏幕)。
是否可以要求 ROBOCOPY 以指示成功或失败的退出代码退出?
我正在使用 ROBOCOPY 作为我的 TeamCity 构建配置的一部分,并且不得不添加一个步骤来使 ROBOCOPY 的退出代码静音对我来说似乎很愚蠢。
基本上,我已经添加了这个:
EXIT /B 0
Run Code Online (Sandbox Code Playgroud)
到正在运行的脚本。
然而,这当然掩盖了 ROBOCOPY 会返回的任何实际问题。
基本上,我希望成功的退出代码为 0,失败的退出代码为非零,而不是 ROBOCOPY 现在返回的位掩码。
或者,如果我不能这样做,是否有一个简单的批处理命令序列可以将 ROBOCOPY 的位掩码转换为类似的值?
如果我执行远程端口转发,-R 3690:localhost:3690当远程主机上的端口上已经存在绑定时,我会收到以下警告:
Warning: remote port forwarding failed for listen port 3690
Run Code Online (Sandbox Code Playgroud)
有没有办法让 ssh 失败(即以非零返回码退出),而不仅仅是发出警告?
我有一个备份任务失败,结果非零,但任务计划程序说它正确执行了任务。
有没有办法告诉任务计划程序任务失败?
当使用 vim 来“回复”某个程序(通常是 git)时,故意退出错误会很有用,以中止打开窗口的整个操作。喜欢
$ git commit -a
# vim opens, showing me the staged files and asking for a commit message
# oops, I see some stuff staged that wasn't supposed to be committed
:cq # exit vim with nonzero exit code
Run Code Online (Sandbox Code Playgroud)
这将阻止git实际执行提交。
现在不幸的是,有些机器已经nano配置为默认编辑器,所以我偶尔会发现自己在那个编辑器中,相应地很无助。
我现在所做的是:使用另一个ssh会话和killall editor.
有没有办法从 nano 本身内部做同样的事情,对应于 vim 的:cq?
下面的命令根据失败与否正确打印“0”或“1”,因为我把 $? 在“su”命令中。
sudo su -m $USER -c "./shutdown.sh &> /dev/null; echo \$?"
Run Code Online (Sandbox Code Playgroud)
但是,如果我这样做:
sudo su -m $USER -c "$BASE/bin/shutdown.sh &> /dev/null"; echo $?
Run Code Online (Sandbox Code Playgroud)
它将始终打印“0”,因为即使命令部分失败,实际的“su”也将始终成功。
知道如何检索子外壳的退出代码吗?
当我跑
curl | tee test.txt; echo ${PIPESTATUS[0]}
Run Code Online (Sandbox Code Playgroud)
我正确地看到
curl:尝试“curl --help”或“curl --manual”以获取更多信息
2
但是当我尝试使用“/bin/sh”运行完全相同的命令时:
sh -c "curl | tee test.txt; echo \${PIPESTATUS[0]}"
Run Code Online (Sandbox Code Playgroud)
我得到
curl:尝试“curl --help”或“curl --manual”以获取更多信息
sh: 1: 替换错误
Bad substitution请问我们如何解决问题?
对于我的持续集成脚本,我想检查 git 分支是否与 master 分支不同步。因此我使用
git rev-list --left-right --count master...my-branch-name
Run Code Online (Sandbox Code Playgroud)
它会返回…… 喜欢
1 3
Run Code Online (Sandbox Code Playgroud)
(3次提交在master之前,1次在后面)
添加| cut -f1只会给我第一个数字(在主人后面提交)。
现在我想用那个数字退出脚本,因为后面的 0 个提交是成功的,所有其他的都应该给出一个错误。
我怎样才能做到这一点?我试过
exit 'git rev-list --left-right --count master...my-branch-name | cut -f1'
Run Code Online (Sandbox Code Playgroud)
但这会引起
/bin/bash: line 66: exit: git rev-list --left-right --count master...my-branch-name | cut -f1:需要数字参数
是否有最佳实践?
我set -e经常在脚本中使用,但有时,脚本在某些命令中失败是可以的。
我尝试检查是否set -e打开,但找不到方法 - 没有选项(我知道)set可以提供当前值。
也尝试过这样的:
set | grep errexit(errexit是选项名称-e)和set | grep "-e",没有运气。
我想检查是否errexit设置了该选项,以便我可以在我随着时间的推移构建的一些库函数中暂时禁用它(如果需要,可以使用set +e和重新应用set -e)。就像是:
if [ errexit is set ]; then
ERR_EXIT=1
set +e
fi
...
run some code that may fail
...
if [ "${ERR_EXIT}" = 1 ]; then
set -e
fi
Run Code Online (Sandbox Code Playgroud) 根据定义,退出代码 128 表示“无效的退出参数”。但是我总是得到 255(退出状态超出范围),以防参数像浮点数一样无效。
这是我的 linux 发行版上的专有实现吗?
# exit 1.234
exit
bash: exit: 1.234: numeric argument required
$ echo $?
255 //this should be 128?
# exit -1
exit
$ echo $?
255 //this is okay
Run Code Online (Sandbox Code Playgroud)