テストコマンド: 読み取り可能テストが失敗しました

テストコマンド: 読み取り可能テストが失敗しました

ホーム ディレクトリに次の構造のフォルダーとファイルがあります: ~/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 -rFILE存在し、読み取り権限が に従って付与されている 場合は 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 つの方法は、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"

関連情報