我的主目錄中有一個資料夾和一個文件,其結構如下:~/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 本身執行的,而不是由其單獨的內建命令執行的。
解決這個問題的一種方法可以是透過eval
Alator 所示的方法,或者可以利用參數替換(從技術上講,這只是做同樣事情的手動方法):
~$ 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"