任何方式退出bash脚本,但不退出终端

Ric*_*ard 163 linux bash

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

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

编辑:更具体,有两个脚本run2.sh作为

...
. run.sh
echo "place A"
...
Run Code Online (Sandbox Code Playgroud)

run.sh作为

...
exit
...
Run Code Online (Sandbox Code Playgroud)

当我运行它时. run2.sh,如果它进入exit代码行run.sh,我希望它停在终端并留在那里.但是使用exit,整个终端都关闭了.

PS:我试过用return,但echo代码行仍然会被执行....

Dom*_*nef 237

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

而不是使用exit,你会想要使用return.

  • 如果函数是嵌套调用怎么办?即呼叫b,b呼叫c,c想要立即退出a和b. (4认同)
  • 这是我发现有用的另一种解释:http://askubuntu.com/a/53179/148337 (2认同)
  • 尽管这是正确的,但这并不是一个很好的答案。它忽略了调用脚本可能声明被调用脚本需要访问的变量或函数。更好地解释如何设置返回代码,然后在 `runs.sh` 中处理它 @ruakh 对这个问题有更好的答案。 (2认同)

rua*_*akh 39

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

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

     return [n]
Run Code Online (Sandbox Code Playgroud)

导致shell函数以返回值n退出.如果未提供n,则返回值是函数中执行的最后一个命令的退出状态.这也可以用于终止使用.(或source)内置执行的脚本的执行,返回n或脚本中执行的最后一个命令的退出状态作为脚本的退出状态.RETURN在执行函数或脚本之后继续执行之前,将执行与陷阱关联的任何命令.返回状态是非零值,如果return被使用的功能外,而不是由执行脚本的过程中.source.

  • `return`只能在函数中使用.如果使用`return`并将其作为shell脚本执行(例如`sh run.sh`),bash将报告错误 - "return:只能从函数或源脚本返回" (3认同)
  • @TzungsingDavidWong:您确实意识到这个答案的大部分内容都是来自官方参考手册的引用?您引用的错误消息是否与此答案一致,而不是您的主张? (3认同)

小智 11

您可以在 return 语句/命令之后添加一个额外的退出命令,以便它同时适用于从命令行执行脚本和从终端获取的脚本。

脚本中的退出代码示例:

   if [ $# -lt 2 ]; then
     echo "Needs at least two arguments"
     return 1 2>/dev/null
     exit 1
   fi
Run Code Online (Sandbox Code Playgroud)

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

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


Vio*_*rea 9

而不是使用运行的代码. run2.sh,你可以使用运行脚本sh run2.shbash run2.sh
一个新实例,将打开运行脚本,然后它会在剧本留下打开另一个壳的年底前关闭.`

  • OP 明确指出来源是一项要求。 (2认同)

kar*_* li 5

事实上,我认为你可能对自己应该如何做感到困惑run a script

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

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

详细请参阅使用之间有什么区别?shsource