回答:
絶対パスを使用している限り-f(および「ファイルが存在し、通常のファイルである」)、実際に実行したいテストである限り、記述している内容は正常に機能します。
/質問に投稿した内容の末尾に表示されます-ディレクトリをテストしていますか?それは-d、または単純に-e(「その名前で何かが存在する-タイプに関係なく」)
また、道に沿って何かが読み取れない場合を除きことに注意してくださいは、test([)など(rootが所有し、ファイルが存在するかどうかを伝えることができる必要があり[ -f /root/.ssh/known_hosts ]、おそらく失敗するでしょう、/root/.sshディレクトリではありませんので(あるいは少なくともshouldn 't be)通常のユーザーが読み取り可能です。 [ -f /etc/crontab ]成功する必要があります。
sudoコマンドが失敗した場合(不正なパスワード、/ etc / sudoersで許可されていないなど)、ファイルが存在しない場合と同じ結果が得られます。
sudo働く部分に基づいています:)
if sudo test -f "/path/to/file"; then
echo "FILE EXISTS"
else
echo "FILE DOESN'T EXIST"
fi
反対に、特定のユーザーがファイルまたはディレクトリを読み取れるかどうかをルートから確認したい場合は、次を使用できます。
if sudo -u username test -f "/path/to/file"; then
echo "FILE EXISTS"
else
echo "FILE DOESN'T EXIST"
fi
他の回答に追加して、最初にを実行すると、テストまたはsudo認証の失敗を区別できますsudo true。私が知っているほとんどのsudo実装は、短期間の再認証を必要としません。
例えば:
if sudo true; then
if sudo test -f "/path/to/file"; then
echo "FILE EXISTS"
else
echo "FILE DOESN'T EXIST"
fi
else
echo "SUDO AUTHENTICATION FAILED"
fi