标签: exit-status

保存退出代码以备后用

所以我有一个小脚本来运行一些测试。

javac *.java && java -ea Test
rm -f *.class
Run Code Online (Sandbox Code Playgroud)

现在的问题是,当我运行脚本时./test,即使测试因为rm -f *.class成功而失败,它也会返回成功退出代码。

我能想到的让它做我想做的事情的唯一方法对我来说很丑陋:

javac *.java && java -ea Test
test_exit_code=$?
rm -f *.class
if [ "$test_exit_code" != 0 ] ; then false; fi
Run Code Online (Sandbox Code Playgroud)

但这似乎是一个常见问题——执行任务,清理,然后返回原始任务的退出代码。

这样做的最惯用的方法是什么(在 bash 或一般的 shell 中)?

shell bash exit-status

17
推荐指数
3
解决办法
2万
查看次数

为什么“file xxx.src”导致“无法打开`xxx.src'(没有这样的文件或目录)”但退出状态为0(成功)?

为什么file xxx.src导致cannot open `xxx.src' (No such file or directory)但退出状态为 0(成功)?

$ file xxx.src ; echo $?
xxx.src: cannot open `xxx.src' (No such file or directory)
0
Run Code Online (Sandbox Code Playgroud)

注意:比较ls

$ ls xxx.src ; echo $?
ls: cannot access 'xxx.src': No such file or directory
2
Run Code Online (Sandbox Code Playgroud)

linux file-command exit-status

17
推荐指数
2
解决办法
3646
查看次数

如何确定变量赋值的返回状态?

我在脚本中看到过这样的结构:

if somevar="$(somecommand 2>/dev/null)"; then
...
fi
Run Code Online (Sandbox Code Playgroud)

这是在某处记录的吗?变量的返回状态是如何确定的,它与命令替换有什么关系?(例如,我会得到相同的结果if echo "$(somecommand 2>/dev/null)"; then吗?)

bash command-substitution variable exit-status

14
推荐指数
1
解决办法
3257
查看次数

ENOANO(无阳极)的用途是什么?

这个问题只是出于无聊的好奇心,但我怀疑其他人也会好奇。搜索 errno.h(Linux 2.6),我发现 ENOANO “No Anode”。没有“无阴极”错误的迹象。查看内核源代码索引,它似乎没有被称为阳极的设备使用,只是一些晦涩的设备驱动程序故意将其用作奇怪的错误代码。谷歌搜索没有发现任何有趣的东西。

这可能是一个笑话吗?它是否在诸如 POSIX 之类的标准文档中定义,但没有用?

history linux-kernel exit-status

13
推荐指数
1
解决办法
1880
查看次数

当没有找到任何东西时,使查找失败

find被调用以找不到任何内容时,它仍然以代码 0 退出。有没有办法让它在没有找到文件时返回一个指示失败的退出代码?

find exit-status

13
推荐指数
1
解决办法
4322
查看次数

非活动与禁用以及活动与启用服务之间的差异

我对启用或活动和禁用或不活动的概念感到困惑。

有人可以解释一下吗?

systemd systemctl exit-status

12
推荐指数
2
解决办法
2万
查看次数

如何让`local` 捕获退出代码?

在我的项目中,我有以下代码段:

local output="$(bash "${1##*/}")"
echo "$?"
Run Code Online (Sandbox Code Playgroud)

这总是打印零,因为local,但是,删除local会导致$?变量正确运行:假设子shell 的退出代码。

我的问题是:如何在捕获退出值的同时保持这个变量本地化?

bash variable exit-status

12
推荐指数
2
解决办法
1473
查看次数

bash中单次操作获取grep的输出和返回值

我正在写一个 bash 脚本;我执行某个命令和grep。

pfiles $1 2> /dev/null | grep name # $1 Process Id
Run Code Online (Sandbox Code Playgroud)

响应将类似于:

sockname: AF_INET6 ::ffff:10.10.50.28  port: 22
peername: AF_INET6 ::ffff:10.16.6.150  port: 12295
Run Code Online (Sandbox Code Playgroud)

响应可以是无行、1 行或 2 行。
如果 grep 不返回任何行(grep 返回代码 1),我将中止脚本;如果我得到 1 行,我调用 A() 或 B() 如果超过 1 行。当输出为 1-2 行时,grep 的返回码为 0。

grep 有返回值(0 或 1)和输出。
我怎样才能抓住他们?如果我做这样的事情:

OUTPUT=$(pfiles $1 2> /dev/null | grep peername)
Run Code Online (Sandbox Code Playgroud)

然后变量 OUTPUT 将有输出(字符串);我还想要 grep 执行的布尔值。

shell grep bash exit-status

12
推荐指数
2
解决办法
8万
查看次数

为什么失败的猫返回 1,而其他失败的猫返回 2?

考虑:(使用 Linux/BASH,不确定 UNIX 是否正确)

在争论一个不存在的文件时,我预计会出现 2 个错误...

grep "i am here" real-file

# Returns: 0 (via: echo $?)

grep "i am not here" real-file

# Returns: 1

grep "i am not here" not-a-file

# Returns: 2 (No such file or directory)

ls real-files

# Returns: 0

ls not-files

# Returns: 2 (No such file or directory)
Run Code Online (Sandbox Code Playgroud)

……这些都说得通,但是……

cat real-files

# Returns: 0

cat not-files

# Returns: 1 (No such file or directory)
Run Code Online (Sandbox Code Playgroud)

...“没有这样的文件或目录”不应该是退出状态为 2 的 STDERR 吗?

状态 2 随附 …

cat exit-status

12
推荐指数
3
解决办法
3369
查看次数

Bash 脚本通过测试命令返回状态来检测版本控制系统

我正在编写一个 bash 脚本,我想为多种类型的 VCS 工作。我正在考虑通过运行典型的 info 命令并检查返回码、成功或错误来测试目录是否是系统的存储库。在伪代码中:

if a svn command succeded;
    Then run svn commands
elif a darcs command succeded;
    Then run darcs commands
elif a mercurial command succeded;
    then run hg commands
else 
    something else
fi
Run Code Online (Sandbox Code Playgroud)

我可以运行一个命令,例如 darcs show repo并使用它$?来获取它的返回码。

我的问题是:有没有一种简洁的方法可以在一行中运行并返回返回代码号?例如

if [ 0 -eq `darcs show repo`$? ]; 
Run Code Online (Sandbox Code Playgroud)

还是我必须定义一个函数?

一个额外的要求是 stderr 和 stdout 都应该被打印出来。

bash shell-script exit-status

11
推荐指数
1
解决办法
1万
查看次数