This question is similar to the following link, but focused on using the command line (bash shell).
Using a simple example, when doing the following command:
$ cat <(date); echo $?
Fri Jul 7 21:04:38 UTC 2017
0
Run Code Online (Sandbox Code Playgroud)
The exit value is 0 as expected.
In the following command there is an error introduced on purpose, but the return value is still 0:
$ cat <(datE); echo $?
bash: datE: command not found...
Similar command is: 'date'
0
Run Code Online (Sandbox Code Playgroud)
Is …
在我的终端中,它打印出一个看似随机的数字127。我认为它正在打印一些变量的值并检查我的怀疑,我定义了一个新变量v=4。echo $?再次运行给了我0作为输出。
我很困惑,因为我期待 4 是答案。
尝试使用该/usr/pgsql-9.2/bin/postgres命令启动 PostgreSQL 服务器时,我得到一个退出值代码130.
但是,我找不到有关此命令退出代码的任何文档。什么130意思?
仅供参考,该命令是从 Java 代码执行的,该代码基本上如下所示:
Process dbProcess = Runtime.getRuntime().exec(cmd);
...
int exitCode = dbProcess.exitValue();
Run Code Online (Sandbox Code Playgroud) 我在 Travis-CI 中使用“查找”来检查程序的特定文件类型。(准确地说,它是一个 shellcheck 检查。)
但是,当使用find由它执行的命令/子shell 的退出代码时,它们自然会被丢弃,因为它们不会传递给“主脚本”。
例如,这是一个查找命令:
find . -type f -iname "*.sh" -exec sh ./testScripts.sh "{}" \;
Run Code Online (Sandbox Code Playgroud)
./testScripts.sh 可能会以 0 或 >= 1 退出,具体取决于测试结果。
在testScripts.sh正确使用正确的退出代码,但由于退出find命令的退出代码始终为“0”。我想要的是,如果一个文件/执行错误,这个错误会“传播”到 Travis-CI。
我怎样才能做到这一点?
如果我发出了很多命令,并且我想要退出的进程的退出状态,比如 100 个命令前。linux 中是否有结构、文件位置或变量,我可以访问所有退出的进程并查看有关它们的信息?
我正在尝试自动化一个过程,该过程涉及通过 ssh 在各种机器上运行脚本。捕获输出和返回代码(用于检测错误)至关重要。
设置退出代码按预期工作:
~$ ssh host exit 5 && echo OK || echo FAIL
FAIL
Run Code Online (Sandbox Code Playgroud)
但是,如果有 shell 脚本发出不干净的退出信号,ssh 总是返回 0(通过字符串执行模拟的脚本):
~$ ssh host sh -c 'exit 5' && echo OK || echo FAIL
OK
Run Code Online (Sandbox Code Playgroud)
在交互式 shell 中的主机上运行完全相同的脚本工作正常:
~$ sh -c 'exit 5' && echo OK || echo FAIL
FAIL
Run Code Online (Sandbox Code Playgroud)
我很困惑为什么会发生这种情况。如何告诉 ssh 传播 bash 的返回码?我可能不会更改远程脚本。
我使用的是公钥认证,私钥是解锁的——不需要用户交互。所有系统都是 Ubuntu 18.04。应用程序版本是:
OpenSSH_7.6p1 Ubuntu-4ubuntu0.1, OpenSSL 1.0.2n 7 Dec 2017GNU bash, Version 4.4.19(1)-release (x86_64-pc-linux-gnu)注意:这个问题与这些看似相似的问题不同:
我刚刚将 MariaDB 安装升级到 10.2。
当我现在尝试启动该服务时,它告诉我它失败了,检查状态向我显示了这条相当奇怪的消息:
root@server # systemctl status mariadb
* mariadb.service - MariaDB 10.2.20 database server
Loaded: loaded (/lib/systemd/system/mariadb.service; enabled; vendor preset: enabled)
Drop-In: /etc/systemd/system/mariadb.service.d
`-migrated-from-my.cnf-settings.conf
Active: failed (Result: exit-code) since Wed 2018-12-26 01:54:50 CET; 9min ago
Docs: man:mysqld(8)
https://mariadb.com/kb/en/library/systemd/
Process: 13690 ExecStartPre=/usr/bin/install -m 755 -o mysql -g root -d /var/run/mysqld (code=exited, status=127)
Main PID: 10811 (code=exited, status=0/SUCCESS)
CPU: 0
Dec 26 01:54:50 server systemd[1]: Starting MariaDB 10.2.20 database server...
Dec 26 01:54:50 server systemd[1]: mariadb.service: Control process exited, …Run Code Online (Sandbox Code Playgroud) 我明白这些:
true; echo "$?" # 0
false; echo "$?" # 1
true | echo "$?" # 0
Run Code Online (Sandbox Code Playgroud)
但不是这个:
false | echo "$?" # 0
Run Code Online (Sandbox Code Playgroud)
...为什么不打印1?
我怎么能在管道中强制失败,然后再得到1呢?
我正在尝试启动一个systemd。另一个服务正确退出后的服务(例如:在应用程序中可能是exit(EXIT_SUCCESS) )。
我已经看到在 systemd 的更高版本中可能有一个OnSuccess选项,但我希望能够在没有该选项的情况下执行此操作,因为我的 systemd 版本不支持它。
可以正确地做这样的事情吗?
我有一个 perl 脚本,它运行一个system()调用来执行 shell 命令,我想运行多个命令并在它们之间传输数据。类似于(在 Perl 中):
system("command1 | command2");
Run Code Online (Sandbox Code Playgroud)
Perl 的system()用途/bin/sh,并且由于它们运行在 Ubuntu Server 系统上,因此/bin/sh是dash. 与许多其他 shell 一样,dash 中管道的退出值是最右侧命令的退出值。这意味着类似的事情将会返回0(成功):
system("false | true")
Run Code Online (Sandbox Code Playgroud)
如果我使用的系统是/bin/sh,bash我可以通过添加选项轻松修复它pipefail:
system("set -o pipefail; false | true");
Run Code Online (Sandbox Code Playgroud)
事实上,这在我本地的 Arch 系统上按预期工作,其/bin/sh要点是bash:
$ perl -le '$status = system("false | true"); print $status>>8'
0
$ perl -le '$status = system("set -o pipefail; false | true"); print $status>>8'
1
Run Code Online (Sandbox Code Playgroud)
(是的,我知道这看起来很奇怪,但如果你不了解 …
exit-status ×10
shell ×4
bash ×3
command-line ×2
linux ×2
pipe ×2
services ×2
systemd ×2
dash ×1
exit ×1
find ×1
linux-kernel ×1
mariadb ×1
postgresql ×1
scripting ×1
ssh ×1