use*_*541 6 shell bash shell-script
所以这应该很简单。我正在尝试测试脚本顶部的条件并在条件失败时退出整个脚本,并且我有两个语句要在退出时执行。有一个单独的exit没有第二个语句,这很好,但是无论我如何添加第二个语句,我都无法让它完全退出。隐含的装饰规则是这一切都必须在一行上。当对脚本的这种单行更改没有按预期工作时,我发现了这一点。剧本一直在进行。
首先让我展示一下什么是有效的。如果 $USER 变量不是“x”,则以下行完全退出,这很好。我知道这是有效的,因为在终端窗口中输入这一行将关闭该终端窗口(除非您的用户 ID 确实是“x”),因此它实际上是在执行顶级退出:
[ $USER = 'x' ] || exit 1
Run Code Online (Sandbox Code Playgroud)
所以这很好,就像我想要的那样,除了我想在退出之前回显一条消息;但是,如果我尝试添加回声,则退出不再发生,或者它似乎以“不同的方式”发生,例如可能在 bash 函数上下文或其他内容中。下一行不会关闭您的终端,这很糟糕。
[ $USER = 'x' ] || (echo "Time to bail" ; exit 1)
Run Code Online (Sandbox Code Playgroud)
我想也许分号被回声吃掉了,但不,出口似乎被击中了。我怎么知道?我更改了上面的代码,然后回显了 $? 我看到了我在上面看到“1”的地方放的任何值。当然,我是在我想关闭的终端窗口中查看这些值,但它并没有关闭。
下一个变体还显示了执行 echo 和第二个语句的第二种方法,但在使用 exit 时会再次发生完全相同的行为:
[ $USER = 'x' ] || (echo "Time to bail" && exit 1)
Run Code Online (Sandbox Code Playgroud)
我希望这里有人能让这一切不仅不奇怪而且看起来很合理。
那么这不可能在一条线上完成吗?
( bash --version: GNU bash, version 4.3.30(1)-release)
你正在搜索的是这样的:
[ "$USER" = "x" ] || { echo "Time to bail"; exit 1; }
Run Code Online (Sandbox Code Playgroud)
该{ list; }语句在当前 shell 上下文中执行给定列表中的命令。与( list )符号不同,没有创建子shell 。exit括号之间的调用将退出该子 shell 而不是父 shell 本身。
您的问题中包含一行或多行 if 语句的示例在语法上是正确的。我无法重现这种行为。有多少行并不重要;if 语句永远不会在其主体中启动子shell。
顺便说一句:我在条件中为变量添加了双引号,因为当变量$USER为空时,构造将扩展为[ = "x" ]无效。使用双引号将其扩展为[ "" = "x" ].
| 归档时间: |
|
| 查看次数: |
3103 次 |
| 最近记录: |