在 bash 函数中,我试图捕获命令的输出及其退出代码。一般来说,我的形式是
some_function() {
local rv=$(some_other_function)
local code=$?
echo "$rv"
return $code
}
Run Code Online (Sandbox Code Playgroud)
但我注意到每当我使用“本地”时,然后 $? 总是 0。就像它捕获的是赋值的结果,而不是被调用的函数。如果我不使用“本地”,那么它会按预期工作:
$ foo() { local rv=$(false); echo "code is $?"; }
$ foo
code is 0
$ foo() { rv=$(false); echo "code is $?"; }
$ foo
code is 1
Run Code Online (Sandbox Code Playgroud)
谁可以给我解释一下这个?显然这里有些基本的东西我只是不明白。
我有一个代码片段:
my @array=("abc","def", "ghi");
print "I am testing exit code\n";
grep /lan/, @array;
if ($?) {
print "status is 0\n";
}
else {
print "Status is 1\n";
}
Run Code Online (Sandbox Code Playgroud)
我在输出中得到“状态为 1”,但我想要“状态为 0”。根据我的理解,在 中@array,找不到“lan”,因此退出状态必须非零,因此应打印“status is 0”。
为什么 Perl 没有给出正确的退出代码?如果我按照上面的理解是错误的,请给出关于退出代码理论的正确想法?
不知道怎么问这个问题......问题是如果if ($current[$id][$i]['item'] == '')是真的我需要停止循环运行,所以无论脚本需要做什么或者在这种情况下回声,都不要重复15次.
如果使用exit;整个页面将停止渲染,那么,任何想法?
提前致谢.
如果问题不够清楚,请不要犹豫,请使用评论,我将非常乐意澄清任何疑问.
$i=1;
while($i<=15) {
if ($current[$id][$i]['item'] == '') {
echo 'Done!.';
//do something
}
$a++;
}
Run Code Online (Sandbox Code Playgroud) 当我在下面的代码中调用我的SegTree结构的构造函数时,我不断得到一个非零的退出代码.当我注释掉初始化结构的行时,程序运行没有问题.有人可以解释为什么会发生这种情况以及如何修复我的代码吗?
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
#include <string>
#include <vector>
#include <string.h>
using namespace std;
struct SegTree{
int N;
long long tree [1<<20], arr [1<<20];
SegTree(int x){ N = x; }
};
int main(){
SegTree st(len);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
请帮助,并提前感谢!
编辑:我的问题不是数组的大小,正如我在评论中提到的那样.我可以创建数组并在将它们放在结构外部时运行代码.
假设我们在下面写了以下内容test_script.py:
sys.exit(-992340374290374)
Run Code Online (Sandbox Code Playgroud)
我们收到以下错误消息:
"[drive_letter]:\[path to python.exe]" [drive_letter]:/[path to script]
Process finished with exit code -1
Run Code Online (Sandbox Code Playgroud)
-1不是-992340374290374.发生了什么?
我对bash进行了测试,发现了以下代码:
#!/bin/bash
[[ `which pacman` ]] && echo pacman
[[ `which apt-get` ]] && echo apt-get
Run Code Online (Sandbox Code Playgroud)
它将测试安装了什么包管理器并回显它。
在某些系统上,失败的which命令会将错误打印到stderr. 我想抑制which命令的所有输出。
所以我想出了以下代码:
#!/bin/bash
[[ `which pacman >/dev/null 2>&1` ]] && echo pacman
[[ `which apt-get >/dev/null 2>&1` ]] && echo apt-get
Run Code Online (Sandbox Code Playgroud)
但这不会输出任何内容。当我在命令行上运行每个命令时,如下所示:
which pacman >/dev/null 2>&1 && echo $?
Run Code Online (Sandbox Code Playgroud)
在带有 的系统上pacman,它会打印0它应该打印的内容。这&&也证明前面的命令成功了。
那么为什么重定向代码不像在命令行上那样工作呢?我可以在脚本中添加什么以使其正常工作?
这对我来说真的很困惑,因为我以前从未遇到过此类问题。通常,任何在命令行上运行的命令也应该在 bash 脚本中运行,不是吗?
set -eo pipefail
commandThatFails || exitFunction
exitFunction
Run Code Online (Sandbox Code Playgroud)
所以这个脚本运行 exitMethod 两次......我认为set -e在任何非零退出代码上立即退出并set -o pipefail确保在管道期间任何失败是最终退出状态代码而不是最近的命令?
因此我想:
在文档中它指出:
如果失败的命令是紧跟在 while 或 until 关键字之后的命令列表的一部分、if 语句中测试的一部分、在 && 或 || 中执行的任何命令的一部分,则 shell 不会退出 列表除了最后一个 && 或 || 之后的命令,管道中除最后一个之外的任何命令,或者如果命令的返回状态正在用 ! 反转。如果除子 shell 之外的复合命令由于命令在 -e 被忽略时失败而返回非零状态,则 shell 不会退出。如果设置了 ERR 上的陷阱,则会在 shell 退出之前执行。
我认为 exitfunction 是command following the final ||so 因此会被计数并立即退出。
我可以通过以下方式解决问题:
commandThatFails || { exitFunction; exit 1; }
Run Code Online (Sandbox Code Playgroud)
但这似乎不是更优雅的处理方式,任何想法都值得赞赏!
AFAIK,退出代码可能会根据应用程序和项目中采用的约定而有所不同。但是,我想知道是否有 C/C++ 项目的退出代码标准列表。
当我尝试运行我的Perl脚本时,它会成功执行.后来,当我运行这个命令时echo %errorlevel%,它给出了输出为1.为什么?
嗨,我是golang的新手,
我使用defer来关闭我的结果集.
defer res.Close()
Run Code Online (Sandbox Code Playgroud)
我想res is nil在打电话之前 检查一下res.Close().
我在函数的末尾有下面的代码块,但是由于某些错误而退出时不会调用它.
if(res!=nil){
res.Close()
}
Run Code Online (Sandbox Code Playgroud)
我想知道有什么办法可以实现这个目的defer.
defer if(res!=nil){
res.Close()
}
Run Code Online (Sandbox Code Playgroud)
处理这些情况的惯用方法是什么?
I\xe2\x80\x99m 在 bash 脚本中运行 watch 命令。我希望脚本在停止 watch 命令 (Ctrl+c) 后运行命令。我在脚本中的 watch 命令之后放置的任何内容都不会执行
\n我的程序有一个ESyntaxError类,我这样使用:
raise ESyntaxError.Create(Message)\nRun Code Online (Sandbox Code Playgroud)\n\n我将该ESyntaxError类定义如下:
ESyntaxError = class(Exception)\nRun Code Online (Sandbox Code Playgroud)\n\n我观察到,如果ESyntaxError.Create(Message)调用了该代码,我的程序\xe2\x80\x99s 退出代码将设置为1. 但在这种情况下我希望将其设置为65.
我尝试这样做:
\n\nExitCode := 65;\nraise ESyntaxError.Create(Message);\nRun Code Online (Sandbox Code Playgroud)\n\n...但是我的应用程序仍然只是以 退出1,而不是65\xe2\x80\x94 我猜是因为内置Exception类总是重置ExitCode为1?(Don\xe2\x80\x99t 确实知道 \xe2\x80\x99 是这种情况,并且在异常文档中没有看到任何明确说明这一点,但我从我在这里观察到的行为推断出这一点)。
或者,如果我想让程序具有非1/非0退出状态,我是否应该以其他方式处理这个问题而不是基于它Exception?
exit-code ×12
bash ×4
exit ×3
c++ ×2
perl ×2
batch-file ×1
c ×1
exception ×1
freepascal ×1
go ×1
pascal ×1
php ×1
python ×1
python-3.x ×1
resultset ×1
shell ×1
struct ×1
variables ×1
watch ×1
while-loop ×1