任何方式退出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.sh
或bash 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
如果您的terminal模拟器没有 – 可以清理源脚本,并拿着terminal:
#!/bin/sh sed "s/exit/return/g" script >/tmp/script . /tmp/script read
否则你可以使用$TERM -hold -e script
还要确保返回预期的返回值。 否则,如果您在遇到退出时使用exit,它将退出基本shell,因为source不会创build另一个进程(实例)。
正如其他人已经注意到的,源代码和执行脚本使用return
和exit
来保持相同的会话是正确的。
这里有一个相关的提示,如果你想要一个脚本,应保持会议打开,无论是否来源。
下面的例子可以像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
下面。 从某种意义上说,它也可以使代码更具可移植性(如果有大量的脚本可能会或可能不会以不同的方式被调用),但是在适当的时候使用return
和exit
方式则不那么笨拙。
1)如果成功,退出0将从脚本中出来。
2)如果失败,退出1将从脚本中出来。
你可以尝试以上这两个基于你的要求。