
存在するコードレビュー
誰かが構造を次のように変えなければならないと指摘しました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.
質問
test
私がやっていることを100%理解したいので、これら2つのコマンドの違いと使い方の詳細な説明を求めることはできますか?
答え1
一部の「ファイル」は、実際にはディレクトリ(-d
)、FIFO(-p
)、デバイスノード(-b
および-c
)などです。存在しますが、通常のファイルではありません。
答え2
これは私のコメントのようです!
-e
ディレクトリ、パイプ、ソケット、デバイスなどの非正規ファイルに対してテストすると、trueが返されます。
シンボリックリンクは特別なケースです。test
通常、以下を使用します。先のとがったリンク自体ではないファイルです(test -L
、別名を除くtest -h
)。
引用されたコメントでは、可能FIFOからデータを読み取ることができるようにしたいです。 (一方、ディレクトリからの読み込みは間違いなく動作しません。)
後でコメントしてみると本当にいいえデバイスを上書きしようとしています(FIFOに書きたい場合があるため、必要に応じて微調整)。
答え3
既に存在する名前でディレクトリエントリを生成しないためにテストを使用しているため、そのエントリがすでに存在し、可能であればエントリが何であるか(通常のファイル、ディレクトリ、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."