"Permission Denied" bash 脚本中的 ls 错误

"Permission Denied" ls error in bash script

#!/bin/bash
#ls /home/"$(whoami)"
#ls /home/"$(whoami)/.bashrc"

[[ $# -eq 0 ]] && echo "Pass at least a valid filepath!" && exit 1;
[[ $# -eq 1 ]] && mode=1; arg1=""
[[ $# -eq 2 ]] && mode=2; arg1=""; arg2=""
if [[ mode -eq 1 ]]
then
while :
do
"$(ls "")"
[[ $? -eq 0 ]] && echo " has been downloaded! I'm going to poweroff now.."
sleep 20m;
done
elif [[ mode -eq 2 ]]
then
while :
do
"$(ls "")" 3> /dev/null
if [[ $? -eq 0 ]]
    then
    "$(ls "")" 3> /dev/null
    if [[ $? -eq 0 ]]
        then
        echo " \n and \n  \have been downloaded! I'm going to poweroff now.."
    fi
sleep 20m;
fi
done
else
echo "Not more than two arguments! Exiting.."; exit 1;

这是我的代码。(这不是最终版本,只是测试) 给定一个存在的文件路径 returns 一个 ls 权限错误。我检查了权限并尝试了不同的情况,如最初的评论所示,我还检查了谁是 运行 脚本(也许这是一个荒谬的错误(?))。 我在 bash 提示符下尝试了相同的命令和文件路径,并且效果很好。有人知道可能是什么问题吗? 错误示例:

Documents/CheckFilesThenDo.sh: line 12: /home/user/Downloads/file: Permission denied

编辑: 前面已经说了,并不是说用户不能ls file(真实权限错误)。现在看来是“$(ls)”导致了这种行为(ls 有效)。我还是不明白为什么。

每个 Linux 文件都设置了权限! 您可以在 here!

阅读有关权限类型和...

循环中的第一个命令,

"$(ls "")"

没有多大意义。您正在执行 ls,收集其标准输出,并将 信息解释为要执行的命令。

这留下了两种可能性:

如果此时</code>包含一个文件名,并且<code>ls有访问其目录的权限,命令将简单地输出这个文件名,你将要执行它。这仅在文件具有执行权限时有效,在这种情况下,您可以更简单地编写

""

如果 $1 没有设置 x 位,您将收到“权限被拒绝”。

如果文件不存在,ls 不会向标准输出写入任何内容。您只是看到有关丢失文件的错误消息,但未执行任何操作。

除此之外:如果你真的在你的问题中引用了完整的错误消息,这意味着脚本不是由 bash 执行的,因为 bash 会说这样的话:

bash : Documents/CheckFilesThenDo.sh:: 第 12 行 : ....权限被拒绝。