任何方式退出bash脚本,但不能退出terminal

当我在shell脚本中使用exit命令时,脚本将终止terminal(提示符)。 有什么方法可以终止脚本,然后停留在terminal?

我的脚本run.sh预计将通过直接来源或来自另一个脚本来执行。

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

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

run.sh as

 ... exit ... 

当我运行它. run2.sh . run2.sh ,如果它在run.sh中inputexit代码行,我希望它停止到terminal,并留在那里。 但是使用exit ,整个terminal被closures。

PS:我试图使用return ,但echo codeline仍然会被执行….

这个“问题”的确是你正在采购而不是执行脚本。 源文件时,其内容将在当前shell中执行,而不是产生子shell。 所以一切,包括退出,都会影响当前的shell。

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

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

Bash参考手册的 §4.1“Bourne Shell Builtins”提出:

  return [n] 

导致shell函数以返回值n退出。 如果未提供n ,则返回值是在该函数中执行的最后一个命令的退出状态。 这也可以用来终止正在执行的脚本的执行. (或source ),返回脚本的退出状态n或脚本内执行的最后一个命令的退出状态。 任何与RETURN陷阱相关的命令在执行之前都会在函数或脚本之后执行。 如果在函数外部使用return而不是在脚本执行期间使用return则返回状态不为零.source

而不是运行代码使用. run2.sh . run2.sh可以使用sh run2.shbash run2.sh来运行脚本
将打开一个新实例来运行脚本,然后在脚本结束时closures其他shell。 `

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

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

无论如何,我赞同与Kaz是一个devise问题。

我认为这是因为你正在源模式下运行它

 . myscript.sh 

你应该在一个子shell中运行它:

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

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

如果您的terminal模拟器没有 – 可以清理源脚本,并拿着terminal:

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

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

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

正如其他人已经注意到的,源代码和执行脚本使用returnexit来保持相同的会话是正确的。

这里有一个相关的提示,如果你想要一个脚本,应保持会议打开,无论是否来源。

下面的例子可以像foo.sh或者sourced一样直接运行. foo.sh . foo.sh / source foo.sh 无论哪种方式,它会保持会议“退出”后开放。 传递$@string以便该函数可以访问外部脚本的参数。

 #!/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 "$@"; 

terminal结果:

$ foo.sh
$你想要XYZ吗? (是/否):是
$。 foo.sh
$你想要XYZ吗? (是/否):是
$ |
(terminal窗口保持打开并接受额外的input)

这对于快速testing单个terminal中的脚本更改非常有用,同时在工作时将一堆废品代码保留在主要exit / return下面。 从某种意义上说,它也可以使代码更具可移植性(如果有大量的脚本可能会或可能不会以不同的方式被调用),但是在适当的时候使用returnexit方式则不那么笨拙。

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

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

你可以尝试以上这两个基于你的要求。