在 shellscript 中返回错误而不是错误退出

在 shellscript 中返回错误而不是错误退出

我知道那set -e是我的朋友为了错误退出。但是,如果脚本是来源的,例如从控制台执行函数,该怎么办?我不想让控制台因错误而关闭,我只想停止脚本并显示错误消息。

我需要检查$吗?手动执行每个命令以使这成为可能?

这里有一个示例脚本myScript.sh来显示问题:

#!/bin/sh
set -e

copySomeStuff()
{
    source="$1"
    dest="$2"
    cp -rt "$source" "$dest"
    return 0
}

installStuff()
{
    dest="$1"
    copySomeStuff dir1 "$dest"
    copySomeStuff dir2 "$dest"
    copySomeStuff nonExistingDirectory "$dest"
}

该脚本的使用方式如下:

$ source myScript.sh
$ installStuff

这只会关闭控制台。显示的错误cp丢失。

答案1

我建议您将一个脚本作为子 shell 运行,可能会获取一个文件来读取函数定义。让该脚本errexit为自己设置 shell 选项。

当您从命令行使用时source,“脚本”实际上是您的交互式 shell。退出意味着终止 shell 会话。可能有一些方法可以解决这个问题,但如果您想设置errexit会话,最好的选择就是:

#!/bin/bash

set -o errexit

source file_with_functions
do_things_using_functions

额外的好处:不会污染函数的交互会话。

答案2

如果您获取它,它将忽略#!并将适用set -e于调用 shell,因此将适用于所有后续命令。

你可以强制使用子 shell:

copySomeStuff()
{
    (
        set -e
        source="$1"
        dest="$2"
        cp -r "$source" "$dest"
        return 0
    )
}

另外为了安全:

  • 不要使用全部大写的变量名称,因为可能与环境名称冲突。 (上周我们有一个问题,关于为什么脚本不起作用,它有一个变量 PATH)

  • 使用引号。

  • 始终使用-t-T选项cp, mv, ln。例如

    • cp -t destination_directory source_files …
    • cp -T source_file destination_file

    请注意,-t-T是 Gnu 扩展,在某些其他 Unix 上不可用,因此为了可移植性,您可以代替该-t选项:

    • cp source_files … destination_directory/

    我不知道有替代的安全形式-T

相关内容