Questions tagged «exit-status»

如果您的问题是围绕确定或利用命令的退出状态(返回代码),请使用此标记。通用语法涉及$?变量以及&&和|| 符号。

7
命令的日志退出代码,类似于time命令
使用 time sleep 1 产量: $ time sleep 1 real 0m1.005s user 0m0.001s sys 0m0.001s 有没有我可以用来打印退出代码的sleep命令或我想运行的任何命令? 喜欢的东西: $ log-exit-code sleep 1 也许这足够了? sleep 1 && echo "$?"
10 exit  exit-status 

2
分配类似于具有退出状态的命令,除了何时有命令替换?
请参阅以下示例及其在POSIX Shell中的输出: false;echo $?或false || echo 1:1 false;foo="bar";echo $?或foo="bar" && echo 0:0 foo=$(false);echo $?或foo=$(false) || echo 1:1 foo=$(true);echo $?或foo=$(true) && echo 0:0 正如在/programming/6834487/what-is-the-variable-in-shell-scripting中投票最高的答案所提到的: $? 用于查找最后执行的命令的返回值。 在这种情况下,这可能有点误导,因此让我们获取POSIX定义,该定义也在该线程的帖子中被引用: ?扩展到最新管道的小数退出状态(请参见管道)。 因此,它仿佛是一次分配本身算作一个命令(或者说管道部分)以零退出值,但其应用之前分配的右侧(例如,在我的例子命令替换调用这里)。 我从实际的角度看这种行为是有道理的,但对我而言,分配本身按该顺序进行计数似乎有点不寻常。也许要弄清楚为什么对我来说很奇怪,让我们假设赋值是一个函数: ASSIGNMENT( VARIABLE, VALUE ) 那foo="bar"会是 ASSIGNMENT( "foo", "bar" ) 并且foo=$(false)会像 ASSIGNMENT( "foo", EXECUTE( "false" ) ) 这意味着先EXECUTE运行,然后才运行,但这仍然是重要的状态。 ASSIGNMENTEXECUTE 我的评估是否正确,或者我误会/遗漏了什么?这些是我将这种行为视为“奇怪”的正确原因吗?


1
导致`less`以非零状态码退出?
我希望具有以下命令结构: command && check-status | less && followup-command 当用户与进行交互时,这将暂停执行less。用户如何强制less以非零状态退出以阻止followup-command运行? 我目前正在使用 less 458 (POSIX regular expressions)



6
基于返回值而不是退出代码构造管道的优美方法?
当状态代码无效时,是否仍然可以根据stdout的输出构造管道? 我希望答案不是解决用例,而是shell脚本范围内的问题。我要尝试做的是根据国家和语言代码猜测名称,从而找到存储库中最具体的软件包。 以这个为例 $PACKAGE1=hunspell-en-zz $PACKAGE2=hunspell-en 第一个猜测更合适,但可能不存在。在这种情况下,我想回到hunspell-en($PACKAGE2),因为第一个选项hunspell-en-zz($PACKAGE1)也不会存在。 apt-cache的管道 apt-cache只要命令能够运行(从的文档apt-cache),该命令就会返回成功(由shell定义为退出代码零) apt-cache在正常运行时返回零,在错误时返回十进制。 这使得在管道中使用该命令更加困难。通常,我期望404的等效程序包搜索会导致错误(如curl或会发生wget)。我想搜索以查看是否存在一个软件包,如果不存在,则回退到另一个软件包。 这不会返回任何内容,因为第一个命令将返回成功(因此,||从不运行rhs ) apt-cache search hunspell-en-zz || apt-cache search hunspell-en apt-cache search 有两个参数 这不会返回任何内容,因为apt-cache它的参数是AND, apt-cache search hunspell-en-zz hunspell-en 来自的文档 apt-cache 可以使用单独的参数来指定多个和在一起的搜索模式。 因此,由于其中一个参数显然不存在,因此不会返回任何内容。 问题 什么是外壳惯用语来处理约定,例如apt-cache在返回代码对任务无用的情况下?而成功仅取决于STDOUT上是否存在输出? 相似 一无所获使查找失败 他们都源于同一个问题。那里选择的答案提到find -z了可悲的是这里不适用于解决方案,并且是针对用例的。没有提及习惯用法或在不使用空终止的情况下构建管道(不是的选项apt-cache)

1
为什么以存储的嵌套命令返回码退出会导致Dash和Bash中的返回码不同?
跑步 bash -c 'bash -c "echo test1; exit 1;" &> /tmp/x; buildresult=$?; tail -n 100 /tmp/x; exit $buildresult;' 根据我的理解,这导致将结果test1打印到控制台并echo $?进行打印1,因为命令应该返回内部[b/d]ash -c返回的内容,而 dash -c 'dash -c "echo test1; exit 1;" &> /tmp/x; buildresult=$?; tail -n 100 /tmp/x; exit $buildresult;' 结果相同,但0根据则返回echo $?。 我想了解这种差异,以便加深对Shell和可移植Shell编程的了解。 我在Ubuntu 17.10(Artful Aardvark)上使用bash4.4.12和dash0.5.8-2.3ubuntu1。

6
测试后如何保持上次退出状态
测试后是否可以保持最后的命令退出状态($?)不变? 例如,我想做: command -p sudo ... [ $? -ne 1 ] && exit $? 最后一个exit $?应返回sudo退出状态,但始终返回0(测试的退出代码)。 没有临时变量,是否可以这样做? 另一个示例进一步说明: spd-say "$@" [ $? -ne 127 ] && exit $? 在这种情况下,我只想找到第一个命令(退出代码!= 127)就退出。而且我想用实际的spd-say退出代码退出(可能不是 0)。 编辑:我忘了提一下,我更喜欢POSIX投诉解决方案以获得更好的可移植性。 我在脚本中使用此结构,在脚本中我想为同一命令提供替代方法。例如,请参阅我的crc32脚本。 临时变量的问题在于它们可能会遮盖其他变量,并避免必须使用长名称,这不利于代码的可读性。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.