ホーム ディレクトリに次の構造のフォルダーとファイルがあります: ~/folder/file
。
フォルダーとファイルの両方に完全な権限が与えられました (フォルダーは 700、ファイルは 600)。次のテスト コマンド (シェル スクリプト内にあるので、重要ではありません) は、予期せず (私見ですが) false を返します。
[ -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
FILE
存在し、読み取り権限が に従って付与されている 場合は true を返しますman test
。
答え1
結局、問題が見つかりました。問題は、キーボードからパスを読み取っていたのですが (読み取りコマンド)、どういうわけかチルダ (~) が展開されていなかったことです。これに対する解決策は次のとおりです。
echo 'Give path:'
read var1
var2=$(eval echo "$var1");
これで、var2 には完全なパス (~ を展開) が含まれるようになり、その後はテストを通常どおり使用できるようになりました。
答え2
サプリメントへアラトールの答え、 注意すべきことチルダ拡張以下の場合にのみ実行されます:
- 変数の代入は、
~
の直後に引用符:
なしで記述します。mypath=~/Documents:~/usr/share/stuff
=
最初の の後に 引用~
符なしで変数を代入する。foo=~/bar
- 「単語」の始まり:
~/ascript.sh
- 「単語」を分離する:
stat ~/afile.txt
read
は文字のリテラルシーケンスを受け取りstdin
、チルダ展開を実行しません。さらに重要なのは、チルダ展開は個々の組み込みコマンドではなく、シェル自体によって実行されることです。
これに対処する 1 つの方法は、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"