web-dev-qa-db-ja.com

シェルスクリプトでのtest -fとtest -eの違いと使用法の明確化

コードレビュー

私はそのようなtest構造を変更する必要があると指摘されています:

[ ! -f "$1" ] &&
print_error_and_exit "The given argument is not an existing file."

同様の何かに、具体的には:

[ ! -e "$1" ] ...

しかし、これに関する情報は見つかりませんtest -eそれ以外はinfo test;関連する章を引用する:

16.3.3 File characteristic tests
--------------------------------

‘-e FILE’
     True if FILE exists.

16.3.1 File type tests
----------------------

‘-f FILE’
     True if FILE exists and is a regular file.

質問

私が何をしているのかを100%理解したいので、これら2つのタイプのtestコマンドの違いと使用法について、より詳細な説明を求めてもよいですか?

4

それは私のレビューのように聞こえます!

-eを使用したテストは、通常でないファイル(ディレクトリ、パイプ、ソケット、デバイスなど)に対してtrueを返します。

シンボリックリンクは特殊なケースであることに注意してください-testは通常、リンク自体ではなくpointed-toファイルのタイプを使用します(test -L、別名test -hを除く)。

参照されているレビューで、あなたはmight FIFOから読み取れるようにしたいと考えています。 (一方で、ディレクトリから読み取ることはできません)。

レビューの後半で、あなたは本当にしないでくださいデバイスを上書きする必要があります(ただし、FIFOに書き込みたいので、必要に応じて微調整する必要があります)。

4
Toby Speight

一部の「ファイル」は、実際にはディレクトリ(-d)、FIFO(-p)、デバイスノード(-bおよび-c)などです。これらは存在しますが、規則的ではありませんファイル。

テストを使用して、すでに存在する名前のディレクトリエントリの作成を回避しているので、エントリが何であるか(通常のファイル、ディレクトリ、fifo、デバイスノードなど)は問題ではありません。 (名前が既に使用されているため)。

-fテストは「通常のファイル」のみを検出します。 -e他のいくつかのタイプを検出します。

これはあなたの意図に近いです:

[ -e "$output_filename" ] && 
    print_error_and_exit 6 "Destination file name exists."

しかし -eはリンクを検出しません。この構成を使用する必要があります:

[ -e "$output_filename" ] || [ -L "$output_filename" ] && 
    print_error_and_exit 6 "Destination file name exists."
3
Isaac