Linux 退出bash脚本但不退出终端的任何方法
在shell脚本中使用Linux 退出bash脚本但不退出终端的任何方法,linux,bash,Linux,Bash,在shell脚本中使用exit命令时,脚本将终止终端(提示)。有没有办法终止脚本,然后留在终端 我的脚本run.sh应该通过直接源代码或从其他脚本源代码执行 编辑: 更具体地说,有两个脚本run2.shas ... . run.sh echo "place A" ... ... exit ... 和run.shas ... . run.sh echo "place A" ... ... exit ... 当我通过运行它时。run2.sh,如果它在run.sh中点击了exitcodelin
exit
命令时,脚本将终止终端(提示)。有没有办法终止脚本,然后留在终端
我的脚本run.sh
应该通过直接源代码或从其他脚本源代码执行
编辑:
更具体地说,有两个脚本run2.sh
as
...
. run.sh
echo "place A"
...
...
exit
...
和run.sh
as
...
. run.sh
echo "place A"
...
...
exit
...
当我通过运行它时。run2.sh
,如果它在run.sh
中点击了exit
codeline,我希望它停到终端并停留在那里。但使用退出
,整个终端将关闭
PS:我已尝试使用返回
,但回送
代码行仍将被执行….1)如果成功,将从脚本中退出0
2) 如果脚本失败,则退出1
您可以根据您的要求尝试以上两种方法。是;您可以使用
return
而不是exit
。它的主要用途是从shell函数返回,但是如果在源代码-d脚本中使用它,它将从该脚本返回
正如它所说:
使shell函数以返回值n退出。
如果未提供n,则返回值为
函数中执行的最后一个命令。
这也可用于终止正在执行的脚本的执行
使用内置的
(或源代码
)返回n或
脚本中执行的最后一个命令的退出状态作为退出
脚本的状态。
执行与返回
陷阱相关的任何命令
在函数或脚本之后恢复执行前。
如果在函数外部使用返回
,则返回状态为非零
而不是在
或源代码执行脚本期间
“问题”实际上是您正在寻找资源而不是执行脚本。源文件时,其内容将在当前shell中执行,而不是生成子shell。因此,包括exit在内的所有内容都将影响当前shell
不要使用exit
,而是要使用return
这就像在脚本run2.sh中放置run函数一样。
在bash tty中编写run2.sh文件时,在run中使用退出代码。
如果给run函数退出脚本的权限并给run2.sh
它的力量,退出终结者。
然后,因为run函数具有退出teminator的功能
#! /bin/sh
# use . run2.sh
run()
{
echo "this is run"
#return 0
exit 0
}
echo "this is begin"
run
echo "this is end"
无论如何,我同意Kaz的说法,这是一个设计问题。如果您的终端仿真器没有-hold
,您可以清理源代码脚本,并使用以下工具保存终端:
#!/bin/sh
sed "s/exit/return/g" script >/tmp/script
. /tmp/script
read
否则,您可以使用$TERM-hold-e脚本我认为这是因为您在源代码模式下运行它
带圆点
. myscript.sh
您应该在子shell中运行它:
/full/path/to/script/myscript.sh
“source”还请确保返回预期的返回值。否则,如果在遇到退出时使用exit,它将从基本shell中退出,因为源代码不创建另一个进程(实例)。而不是使用运行脚本。run2.sh
,您可以使用shrun2.sh
或bash run2.sh
一个新的子shell将被启动,然后运行脚本,它将在脚本结束时关闭,而另一个shell保持打开状态。正如其他人所指出的,源脚本与执行脚本使用返回
与退出
保持同一会话打开是正确的
这里有一个相关的提示,如果您想要一个脚本来保持会话的打开状态,不管它是否源代码
下面的示例可以像foo.sh
那样直接运行,也可以像那样源代码运行。foo.sh
/源foo.sh
。无论哪种方式,它都会在“退出”后保持会话打开。传递$@
字符串,以便函数可以访问外部脚本的参数
#!/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
$XYZ,您要吗?(是/否):N
$ . foo.sh
$XYZ,您要吗?(是/否):N
$|
(终端窗口保持打开状态并接受其他输入)
这对于快速测试单个终端中的脚本更改非常有用,同时在工作时将一堆废弃代码放在主出口
/返回
下方。它还可以使代码在某种意义上更具可移植性(如果您有大量的脚本,这些脚本可能以不同的方式调用,也可能不以不同的方式调用),尽管只在适当的地方使用return
和exit
就不那么麻烦了。要编写一个安全的脚本,可以作为shell脚本运行,也可以作为rc文件源代码运行,脚本可以检查并比较$0
和$BASH_SOURCE
并确定退出
是否可以安全使用
下面是一个简短的代码片段
[ "X$(basename $0)" = "X$(basename $BASH_SOURCE)" ] && \
echo "***** executing $name_src as a shell script *****" || \
echo "..... sourcing $name_src ....."
实际上,我认为您可能会对如何运行脚本感到困惑
如果使用sh
运行脚本,例如sh./run2.sh
,即使嵌入的脚本以exit
结束,终端窗口仍将保留
但是,如果使用
或源代码
,则下标结束时终端窗口也将退出/关闭
有关更多详细信息,请参阅您可以在return语句/命令之后添加一个额外的exit命令,以便它同时适用于这两种情况,即从命令行执行脚本和从终端寻源
脚本中的退出代码示例:
if [ $# -lt 2 ]; then
echo "Needs at least two arguments"
return 1 2>/dev/null
exit 1
fi
在return
命令之后生成脚本时,将不会调用带有exit
命令的行
执行脚本时,return
命令会给出一个错误。因此,我们通过将错误消息转发到/dev/null
来抑制错误消息。我遇到了同样的问题,从