【问题标题】:Terminal closes when I source my script (run with dot at the start)当我获取脚本时终端关闭(在开始时使用点运行)
【发布时间】:2018-12-03 14:45:46
【问题描述】:

这是我的代码:

#!/bin/bash 
if [[ $1 = "" ]]; then
    exit 0
fi
array=($(cat $1))
let b=${#array[@]}-1
count=0
for i in {1..7}; do
    for j in {30..37}; do
        for n in {40..47}; do
            if [[ $count -gt $b ]]; then
                printf '\n'
                printf '\e[0m'
                exit 1
            fi
            printf '\e[%s;%s;%sm%-5s' "$i" "$j" "$n" "${array[$count]}"
            printf '\e[0m'
            let count=$count+1
        done
        printf '\n'
    done
done
#printf '\n'
printf '\e[0m'
exit 0

问题是当我这样启动时

. color.sh arg

或者没有参数,它只是关闭。我知道原因是exit。有什么方法可以纠正我的代码,这样我就可以在开始时用点启动一个脚本,并且终端在执行后不会关闭?我不想这样开始:./script

【问题讨论】:

标签: linux bash


【解决方案1】:

将所有exit 替换为return。 源脚本中的return 甚至可以使用退出代码:

$ . <(echo "echo before; return 0; echo after")
before
$ echo $?
0
$ . <(echo "echo before; return 7; echo after")
before
$ echo $?
7

【讨论】:

    【解决方案2】:

    当您使用点来运行脚本时,您正在“采购”它,这意味着解释器在当前环境的上下文中读取并执行该脚本中的所有命令,而不产生子 shell,就好像您已经键入了每个你自己。

    这就是为什么如果您获取它,您可以在脚本中设置变量,这些变量在运行后将保留,而在子 shell 中运行会封装它们,并且在脚本结束时它们会消失。

    因此,如果您获取一个命中exit 的脚本,它会导致调用环境退出。建议使用 return 作为Socowi

    【讨论】:

      猜你喜欢
      • 2023-03-16
      • 2014-09-24
      • 2021-01-20
      • 2018-05-11
      • 2022-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多