0

我的一个 bash 脚本中有以下内容:

PID_PATH="$( cd "$( dirname "${BASH_SOURCE[0]}" )/../pids/" && pwd )"

#...

if [ -e $PID_PATH/the_file.pid ]; then
    echo "the_file was found!"
else
    echo "the_file was not found!"
fi

当我回显 PID_PATH 时,它是 100% 正确的,但 if 语句一直评估为假?pids 文件夹本身是一个符号链接,我怀疑 Ubuntu 不喜欢 if 语句中的那个。

有任何想法吗?

编辑:

奇怪的是,当我使用 PID_PATH 变量作为单独的脚本(在同一路径中)单独运行 if 语句时,它可以 100% 工作吗?

4

2 回答 2

0

一些可能性:

  • 是否PID_PATH包含任何空格或其他[^a-zA-Z0-9._-]字符?您应该双引号$PID_PATH/the_file.pid以避免空格扩展。
  • 之前有试过echo "$PID_PATH"上线if吗?
  • 您确定您没有简化示例中可能相关的一些代码吗?
  • 您收到任何错误消息吗?尝试set -o errexit -o nounset -o pipefail在文件顶部使用。
  • 符号链接是否在执行期间的某个时间点损坏?
于 2013-03-19T13:47:51.520 回答
0

奇怪的是,通过在检查 .pid 文件是否存在之前添加短暂的延迟来解决这个问题。

PID_PATH="$( cd "$( dirname "${BASH_SOURCE[0]}" )/../pids/" && pwd )"

#...

sleep 0.3 
if [ -e $PID_PATH/the_file.pid ]; then
    echo "the_file was found!" 
else
    echo "the_file was not found!"
fi

必须与仍在创建的文件有关,同时想要过早地检查它,这是一个典型的赛车条件问题。

于 2013-03-20T10:35:20.197 回答