所以我有一个小脚本来运行一些测试。
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 中)?
为什么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) 我在脚本中看到过这样的结构:
if somevar="$(somecommand 2>/dev/null)"; then
...
fi
Run Code Online (Sandbox Code Playgroud)
这是在某处记录的吗?变量的返回状态是如何确定的,它与命令替换有什么关系?(例如,我会得到相同的结果if echo "$(somecommand 2>/dev/null)"; then吗?)
这个问题只是出于无聊的好奇心,但我怀疑其他人也会好奇。搜索 errno.h(Linux 2.6),我发现 ENOANO “No Anode”。没有“无阴极”错误的迹象。查看内核源代码索引,它似乎没有被称为阳极的设备使用,只是一些晦涩的设备驱动程序故意将其用作奇怪的错误代码。谷歌搜索没有发现任何有趣的东西。
这可能是一个笑话吗?它是否在诸如 POSIX 之类的标准文档中定义,但没有用?
当find被调用以找不到任何内容时,它仍然以代码 0 退出。有没有办法让它在没有找到文件时返回一个指示失败的退出代码?
我对启用或活动和禁用或不活动的概念感到困惑。
有人可以解释一下吗?
在我的项目中,我有以下代码段:
local output="$(bash "${1##*/}")"
echo "$?"
Run Code Online (Sandbox Code Playgroud)
这总是打印零,因为local,但是,删除local会导致$?变量正确运行:假设子shell 的退出代码。
我的问题是:如何在捕获退出值的同时保持这个变量本地化?
我正在写一个 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 执行的布尔值。
考虑:(使用 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 随附 …
我正在编写一个 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 都应该被打印出来。
exit-status ×10
bash ×5
shell ×2
variable ×2
cat ×1
file-command ×1
find ×1
grep ×1
history ×1
linux ×1
linux-kernel ×1
shell-script ×1
systemctl ×1
systemd ×1