Linux 退出bash脚本但不退出终端的任何方法

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

在shell脚本中使用
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

来抑制错误消息。我遇到了同样的问题,从