You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bashrc函数中文件-e/-f检查始终返回false的问题

Bash函数文件存在检查返回false但sudo可正常操作的问题

在bashrc中定义了接收文件名参数的函数,使用-e或-f检查目标文件是否存在时,始终返回false,但后续通过sudo awk操作该文件却能正常执行。尝试过给变量加引号、使用静态字符串等方式,结果都一致。

原始代码

FILE=/var/log/nginx/$1
if [[ -e "$FILE" ]]; then
        echo "exists"
else
        echo "not"
fi
sudo awk '{print $1}' /var/log/nginx/$1 | cut -d" " -f1 | sort | uniq | wc -l

更新后的函数及执行输出

函数代码

views() {
    set -x
    file=/var/log/nginx/$1
    if [[ -e "$file" ]]; then
        echo "exists"
    else
        echo "not"
    fi
    sudo awk '{print $1}' "$file" | cut -d" " -f1 | sort | uniq | wc -l
    set +x
}

执行输出

+ file=/var/log/nginx/dtb_access
+ [[ -e /var/log/nginx/dtb_access ]]
+ echo not
not
+ wc -l
+ uniq
+ sort
+ cut '-d ' -f1
+ sudo awk '{print $1}' /var/log/nginx/dtb_access
7
+ set +x

原因分析

问题核心是权限差异:

  • [[ -e "$file" ]]以当前普通用户身份执行,如果该用户没有/var/log/nginx/目录的访问权限(x权限),或目标文件的读权限(r权限),即便文件实际存在,普通用户也无法检测到它的存在,-e判断会返回false。
  • sudo awk以root身份执行,root拥有系统所有文件的访问权限,因此能正常读取并处理该文件。

解决办法

  • 方法1:用sudo执行文件存在检查,确保以root权限判断:
views() {
    set -x
    file=/var/log/nginx/$1
    if sudo test -e "$file"; then
        echo "exists"
    else
        echo "not"
    fi
    sudo awk '{print $1}' "$file" | cut -d" " -f1 | sort | uniq | wc -l
    set +x
}
  • 方法2:先检查当前用户对目标路径的权限,再做文件判断:
views() {
    set -x
    file=/var/log/nginx/$1
    if [[ -x /var/log/nginx/ ]]; then
        if [[ -e "$file" ]]; then
            echo "exists"
        else
            echo "not"
        fi
    else
        echo "无目录访问权限,尝试用sudo检查"
        if sudo test -e "$file"; then
            echo "文件实际存在"
        fi
    fi
    sudo awk '{print $1}' "$file" | cut -d" " -f1 | sort | uniq | wc -l
    set +x
}
  • 补充:可通过以下命令查看目录和文件的权限配置,确认普通用户的权限情况:
ls -ld /var/log/nginx /var/log/nginx/dtb_access

内容的提问来源于stack exchange,提问作者esseestpercipi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 23:07:13