測試命令:可讀測試失敗

測試命令:可讀測試失敗

我的主目錄中有一個資料夾和一個文件,其結構如下:~/folder/file.

資料夾和檔案都獲得了我的完全權限(資料夾為 700,檔案為 600)。

[ -r ~/folder/file ]
echo $? #Prints 1->Failure

但是,如果我使用文件的替代路徑,例如

pwd #Prints /home/myname
[ -r /home/myname/folder/file ]
[ -r folder/file ]
echo $? #Prints 0->Success

我錯過了什麼嗎?

test -r如果存在則傳回 trueFILE並根據 授予讀取權限 man test

答案1

畢竟我發現了我的問題。

echo 'Give path:'
read var1
var2=$(eval echo "$var1");

現在 var2 包含完整路徑(展開〜),之後我可以正常使用我的測試。

答案2

為補充阿拉託的回答, 應當指出的是波形符擴充僅在這些情況下執行:

  • 變數賦值,~緊接著不加引號:,如mypath=~/Documents:~/usr/share/stuff
  • first 後面的變數賦值=~不含引號,如foo=~/bar
  • 「詞」的開頭:~/ascript.sh
  • 單獨的“詞”:stat ~/afile.txt

read從中取得字元的字面序列stdin並且不執行波形符擴展;更重要的是,波浪號擴展是由 shell 本身執行的,而不是由其單獨的內建命令執行的。

解決這個問題的一種方法可以是透過evalAlator 所示的方法,或者可以利用參數替換(從技術上講,這只是做同樣事情的手動方法):

~$ echo "${foo/\~/$HOME}"
/home/username/Documents 

或者,如果您不介意啟動另一個進程(或者您必須處理這些特定語言),您可以使用 Python 和 Perl,如下所示:

python -c 'import sys,os; print os.path.expanduser(sys.argv[1])' "$foo"
perl -e 'print glob qq("$ARGV[0]")' "$foo" "$foo"

相關內容