簡體   English   中英

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

這是我的代碼。(它不是最終版本,只是測試)給定一個現有的文件路徑,它返回一個 ls 權限錯誤。 我檢查了權限並嘗試了不同的情況,如最初的評論所示,我還檢查了誰在運行腳本(也許這是一個荒謬的錯誤(?))。 我在 bash 提示符中嘗試了相同的命令和文件路徑,並且效果很好。 有人知道可能是什么問題嗎? 錯誤示例:

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

編輯:如前所述,並不是用戶不能 ls 文件(真正的權限錯誤)。 現在看來,它導致了這種行為的“$(ls)”(ls 有效)。 我還是不明白為什么。

每個 Linux 文件都設置了權限。 您可以在此處閱讀有關權限類型和...的信息!

循環中的第一個命令,

"$(ls "$1")"

沒有多大意義。 您正在執行ls ,收集其標准輸出,並將信息解釋為要執行的命令。

這留下了兩種可能性:

如果此時$1包含一個文件名,並且ls有權訪問其目錄,則該命令將簡單地 output 這個文件名,然后您將執行它。 這僅在文件具有執行權限時才有效,在這種情況下,您可以更簡單地編寫

"$1"

如果 $1 沒有設置 x 位,您會得到“權限被拒絕”。

但是,如果該文件不存在,則ls不會向 stdout 寫入任何內容。 您只會看到有關丟失文件的錯誤消息,但沒有執行任何操作。

除此之外:如果您真的在問題中引用了完整的錯誤消息,這意味着該腳本不是由 bash 執行的,因為 bash 會這樣說:

bash :文檔/CheckFilesThenDo.sh::第 12 行:....權限被拒絕。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM