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
相关产品推荐
相关产品推荐

