私はbashスクリプトを書いていますが、通常のファイルとシンボリックリンクを区別する必要があります。 if / test式を使用してこれを行うことができると思いましたが、期待どおりに機能しません。
$ touch regular_file
$ test -f regular_file; echo $?
0
$ test -h regular_file; echo $?
1
$ ln -s regular_file symlink
$ test -h symlink; echo $?
0
$ test -f symlink; echo $?
0
なぜそんなことですか?そしてどうすれば正しくできますか?
ベストアンサー1
テストを少し台無しにしたようです。両方のテストのいずれかを実行する必要はありません。この場合、必要な唯一のテストは、ファイルが-h
シンボリックリンクかどうかを示すテストです。
test -h file && echo "is symlink" || echo "is regular file"
使用中のテストは、-f
オブジェクトがファイルであるか、ファイルへのリンクですが通知します。1
ディレクトリ、デバイスノード、ディレクトリへのシンボリックリンクなどの場合は(失敗)、0
ファイルへのシンボリックリンクの場合は(成功)を返します。つまり、一部のシンボリックリンクは真と評価され、他のシンボリックリンクは偽と評価されます。
ディレクトリ以外のファイルへのシンボリックリンクであるかどうかを知る必要がある場合は、両方のテストの結果を少し論理的に組み合わせる必要があります。