所以 0 意味着是好的,任何其他数字都说明有问题发生,并且,在返回码的上下文中,0 意味着“真”,其他任何数字都意味着“假”。对!这 与你所熟知的逻辑操作完全相反 ,但是你能用这个做什么? 不同的背景,不同的规则。这种用处很快就会显现出来。
让我们继续!
返回码 临时 储存在 特殊变量 ? 中 —— 是的,我知道:这又是一个令人迷惑的选择。但不管怎样,别忘了我们在讨论变量的文章中说过,那时我们说你要用 $ 符号来读取变量中的值,在这里也一样。所以,如果你想知道一个命令是否顺利运行,你需要在命令结束后,在运行别的命令之前马上用 $? 来读取 ? 变量的值。
试试下面的命令:
$ find /etc -iname "*.service" find: '/etc/audisp/plugins.d': Permission denied /etc/systemd/system/dbus-org.freedesktop.nm-dispatcher.service /etc/systemd/system/dbus-org.freedesktop.ModemManager1.service [......]
正如你在上一篇文章中看到的一样,普通用户权限在 /etc 下运行 find 通常将抛出错误,因为它试图读取你没有权限访问的子目录。
所以,如果你在执行 find 后立马执行……
echo $?
……,它将打印 1 ,表明存在错误。
(注意:当你在一行中运行两遍 echo $? ,你将得到一个 0 。这是因为 $? 将包含第一个 echo $? 的返回码,而这条命令按理说一定会执行成功。所以学习如何使用 $? 的第一课就是: 单独执行 $? 或者将它保存在别的安全的地方 —— 比如保存在一个变量里,不然你会很快丢失它。)
一个直接使用 ? 变量的用法是将它并入一串链式命令列表,,这样 Bash 运行这串命令时若有任何操作失败,后面命令将终止。例如,你可能熟悉构建和编译应用程序源代码的过程。你可以像这样手动一个接一个地运行它们:
$ configure . . . $ make . . . $ make install . . .
你也可以把这三行合并成一行……
$ configure; make; make install
…… 但你要希望上天保佑。
为什么这样说呢?因为你这样做是有缺点的,比方说 configure 执行失败了, Bash 将仍会尝试执行 make 和 sudo make install ——就算没东西可 make ,实际上,是没东西会安装。
聪明一点的做法是:
$ configure && make && make install
这将从每个命令中获取退出码,并将其用作链式 && 操作的操作数。
但是,没什么好抱怨的,Bash 知道如果 configure 返回非零结果,整个过程都会失败。如果发生这种情况,不必运行 make 来检查它的退出代码,因为无论如何都会失败的。因此,它放弃运行 make ,只是将非零结果传递给下一步操作。并且,由于 configure && make 传递了错误,Bash 也不必运行make install 。这意味着,在一长串命令中,你可以使用 && 连接它们,并且一旦失败,你可以节省时间,因为其他命令会立即被取消运行。
你可以类似地使用 || ,OR 逻辑操作符,这样就算只有一部分命令成功执行,Bash 也能运行接下来链接在一起的命令。
鉴于所有这些(以及我们之前介绍过的内容),你现在应该更清楚地了解我们在 这篇文章开头 出现的命令行:
mkdir test_dir 2>/dev/null || touch backup/dir/images.txt && find . -iname "*jpg" > backup/dir/images.txt &
因此,假设你从具有读写权限的目录运行上述内容,它做了什么以及如何做到这一点?它如何避免不合时宜且可能导致执行中断的错误?下周,除了给你这些答案的结果,我们将讨论圆括号,不要错过了哟! 【编辑推荐】 - Linux 5.0发布,新特性来袭
- Bash中的&符号和文件描述符
- ASLR是如何保护Linux系统免受缓冲区溢出攻击的
- 如何查看Linux下CPU、内存和交换分区的占用率?
- 如何使用auditd来监控Linux数据中心服务器上的事件?
【责任编辑:庞桂玉 TEL:(010)68476606】
点赞 0 (编辑:上饶站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|