关于linux:任何退出bash脚本但不退出终端的方法 您所在的位置:网站首页 退出shell终端 关于linux:任何退出bash脚本但不退出终端的方法

关于linux:任何退出bash脚本但不退出终端的方法

2023-08-28 04:04| 来源: 网络整理| 查看: 265

当我在shell脚本中使用exit命令时,脚本将终止终端(提示)。 有没有办法终止脚本然后留在终端?

我的脚本run.sh应该通过直接获取或从其他脚本获取来执行。

编辑: 更具体地说,有两个脚本run2.sh

1234... . run.sh echo"place A" ...

和run.sh一样

123... exit ...

当我通过. run2.sh运行它时,如果它在run.sh中点击exit代码行,我希望它停在终端并停留在那里。 但是使用exit,整个终端都会被关闭。

PS:我曾尝试使用return,但echo代码行仍将被执行....

相关讨论 我真的,真的,真的要问:为什么你在源脚本中使用exit? exit命令不应终止您的终端会话/登录。 如果在成功后使用exit 0终止脚本,则在运行脚本ex:./test.sh时,您应该看到输出但控制台仍将保持打开状态。 您可以使用shell命令,该命令实际上是一个shell终端。 然而,我自己的经验是exit不会发生这种情况。 退出通常会将控件返回给父脚本。

"问题"实际上是你在寻找而不是执行脚本。当您获取文件时,其内容将在当前shell中执行,而不是生成子shell。所以包括exit在内的所有内容都会影响当前的shell。

您将不想使用exit,而是使用return。

相关讨论 这是我发现有用的另一种解释:askubuntu.com/a/53179/148337 虽然正确,但这不是一个好的答案。它忽略了调用脚本可能声明调用脚本需要访问的变量或函数。更好地解释如何设置返回代码然后在runs.sh @ruakh处理它有更好的答案这个问题。 如果函数是嵌套调用怎么办?即呼叫b,b呼叫c,c想要立即退出a和b。 来源与复制粘贴几乎相同。如果想要运行脚本并在某个时刻终止,最好使用sh 或bash

是;您可以使用return而不是exit。它的主要目的是从shell函数返回,但如果你在source -d脚本中使用它,它将从该脚本返回。

正如Bash参考手册4.1"Bourne Shell Builtins"所说:

1     return [n]

Cause a shell function to exit with the return value n. If n is not supplied, the return value is the exit status of the last command executed in the function. This may also be used to terminate execution of a script being executed with the . (or source) builtin, returning either n or the exit status of the last command executed within the script as the exit status of the script. Any command associated with the RETURN trap is executed before execution resumes after the function or script. The return status is non-zero if return is used outside a function and not during the execution of a script by . or source.

相关讨论 return只能从函数中使用。如果您使用return并将其作为shell脚本执行(例如sh run.sh),bash将从函数或源脚本报告错误 - return: can only return' @TzungsingDavidWong:您确实意识到这个答案的大部分是来自官方参考手册的引用?并且您引用的错误消息与此答案一致,而不是与您的声明一致? 我并不反对你。我只是想指出,如果脚本作为shell脚本运行而不执行,则return将不起作用。 (或source)。顺便说一句,我在哪里可以找到关于source -d的文件?

您可以使用sh run2.sh或bash run2.sh运行脚本,而不是使用. run2.sh运行代码 将打开一个新实例来运行该脚本,然后在脚本结束时将其关闭,而另一个shell将打开。 `

相关讨论 如果是这样,为什么第二个参数sh"." run2.sh? @ H0WARD你是对的我忘记删除点。我现在已经编辑了答案。 OP明确指出源是一种要求。

这就像你在脚本run2.sh中放置一个run函数一样。 您可以在运行时使用退出代码,同时在bash tty中获取run2.sh文件。 如果给run函数提供退出脚本并给出run2.sh的能力 它有能力退出终结者。 然后,运行功能有权退出您的终止机。

12345678910111213    #! /bin/sh     # use . run2.sh     run()     {         echo"this is run"         #return 0         exit 0     }     echo"this is begin"     run     echo"this is end"

无论如何,我赞同Kaz这是一个设计问题。

您可以在return命令之后添加额外的exit命令,以便它既可以从命令行执行脚本,也可以从终端获取源代码。

脚本中的示例退出代码:

12345   if [ $# -lt 2 ]; then      echo"Needs at least two arguments"      return 1 2>/dev/null      exit 1    fi

在return命令之后获取脚本时,将不会调用带有exit命令的行。

执行脚本时,return命令会出错。因此,我们通过将错误消息转发到/dev/null来抑制错误消息。

我有同样的问题,从上面的答案,从我的理解,最终对我有用的是

有一个调用目标脚本的shebang行,例如,#!/bin/bash使用bash来执行脚本

我有两种shebang的脚本。因此,使用sh或。是不可靠的,因为它导致错误执行(就像脚本挽救运行不完整)

因此答案是

确保脚本有一个shebang,以便毫??无疑问它的预期处理程序 chmod .sh文件,以便它可以执行 直接调用它,没有任何sh或。

./myscript.sh

希望这有助于有类似要求/情况的人

实际上我觉得你可能会对"运行脚本"的方式感到困惑。

如果使用sh运行脚本,例如sh ./run2.sh,即使嵌入式脚本以exit结尾,您的终端窗口仍将保留。

但是,如果使用.或source,则当下标结束时,终端窗口也将退出/关闭。

有关更多详细信息,请参阅使用sh和source有什么区别?

正如其他人已经注意到的那样,源代码执行脚本与执行脚本使用return与exit来保持同一会话打开是正确的。

这是一个相关的提示,如果你想要一个应该保持会话开放的脚本,无论它是否来源。

以下示例可以像foo.sh一样直接运行,也可以像. foo.sh / source foo.sh那样运行。无论哪种方式,它将在"退出"后保持会话开放。传递$@字符串,以便该函数可以访问外部脚本的参数。

123456789#!/bin/sh foo(){     read -p"Would you like to XYZ? (Y/N):" response;     [ $response != 'y' ] && return 1;     echo"XYZ complete (args $@).";     return 0;     echo"This line will never execute."; } foo"$@";

终端结果:

$ foo.sh $ Would you like to XYZ? (Y/N): n $ . foo.sh $ Would you like to XYZ? (Y/N): n $ | (terminal window stays open and accepts additional input)

这对于在单个终端中快速测试脚本更改非常有用,同时在您工作时将一堆废料代码保留在主exit / return下面。它还可以使代码在某种意义上更具可移植性(如果你有大量的脚本可能会以不同的方式调用,也可能不会以不同的方式调用),尽管在适当的地方使用return和exit也不那么笨拙。

我认为这是因为您在源模式下运行它 用点

1. myscript.sh

你应该在子shell中运行它:

1/full/path/to/script/myscript.sh

'source'http://ss64.com/bash/source.html

相关讨论 如果. myscript.sh有效,则不需要脚本的完整路径。最多可能需要./myscript.sh。

要编写一个防弹脚本以作为shell脚本运行或作为rc文件运行,脚本可以检查并比较$0和$BASH_SOURCE,并确定是否可以安全地使用exit。

这是一个简短的代码片段

123["X$(basename $0)" ="X$(basename $BASH_SOURCE)" ] && \     echo"***** executing $name_src as a shell script *****" || \     echo"..... sourcing $name_src ....."

还要确保返回预期的返回值。否则,如果在遇到退出时使用exit,它将退出基本shell,因为源不会创建另一个进程(实例)。

如果您的终端模拟器没有-hold,您可以清理源脚本并按住终端:

1234#!/bin/sh sed"s/exit/return/g" script >/tmp/script . /tmp/script read

否则你可以使用$TERM -hold -e script

1)如果成功,退出0将退出脚本。

2)如果失败,退出1将退出脚本。

你可以根据你的需求尝试以上两种。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有