在专用函数中使用 diff 会导致调用脚本在第一次文件比较时挂起

Using diff in a dedicated function causes the calling script to hang on first file comparison

出于某种原因,在 运行 主脚本之后:

sudo bash main.sh

-> 执行在重定向到文件的第一个差异处停止。

但是,当我注释掉函数名称和括号并直接调用 patching.sh 时 - 它起作用了。

我的脚本有什么问题,当从另一个文件以函数的形式调用它时 - 它会停止,但当直接调用时它会起作用?

main.sh:

set -e
source $(dirname [=10=])/Scripts/patching.sh
# Overwrite files 
update_files

patching.sh:

#!/bin/bash

function update_files() {

    declare -r SW_DIR='Source/packages/'

    CMP_FILE='file1.c'
    diff -u ./$SW_DIR/examples/$CMP_FILE ./Source/$CMP_FILE > file.diff
    cp -v ./Source/$CMP_FILE ./$SW_DIR/examples/$CMP_FILE

}

在调试期间 - 我将 -x 选项添加到 set。这是我现在看到的:

+ declare -r SW_DIR=Source/packages
+ CMP_FILE=file1.c
+ diff -u ./Source/packages/examples/file1.c ./Source/file1.c

这是最后一行。如果我省略重定向运算符 - 差异只会显示在控制台中,仅此而已。它不会继续进行,并显示 no 错误消息。

参见What does set -e mean in a bash script? and BashFAQ/105 (Why doesn't set -e (or set -o errexit, or trap ERR) do what I expected?)。当 set -e 生效时,在 diff 之后执行停止,因为当比较的文件不同时,diff 以 non-zero 状态退出。这种行为是使用 set -e 的缺点之一。点击链接获取更多有用的信息。