我知道那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