在专用函数中使用 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
的缺点之一。点击链接获取更多有用的信息。
出于某种原因,在 运行 主脚本之后:
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
的缺点之一。点击链接获取更多有用的信息。