私たちが使用しているksh93テスト修飾子の1つについて混乱しています。 20年以上前に、私たちは「Unix Shellプログラミング - KornShell機能」コースを受講しました。コースに付属のマニュアルには、ファイルが存在すると「-a filename」が成功することが示されています。それ以来、私たちは「-a」を広く使用してきました。私は最近、「-a」がテスト用の「バイナリAND演算子」であり(AIX 7.1ではksh93を使用しています)、「man test」がそのリンクと同じ出力を表示するというこのリンクを見つけました。
https://www.ibm.com/support/knowledgecenter/en/ssw_aix_71/com.ibm.aix.cmds5/test.htm
リンクは通常のAIXリンクとして表示されます。つまり、私にとっては、ksh、csh、shなどに限定されないので、どのように適用されるのかわかりません。
既存のコードが期待どおりに動作しているようです。現在、私たちがどのように使用するかの例は次のとおりです。
if [[ -a filename ]]
then
....
fi
ファイルテスト用の別の修飾子があることを知っていますが、マンページでは存在するかどうかを確認しないことを示唆していますが、「-a」が存在するかどうかを確認するように見える理由が疑問に思います。
よろしくお願いします。
答え1
ksh
マニュアルから:
Conditional Expressions. A conditional expression is used with the [[ compound command to test attributes of files and to compare strings. Field splitting and file name generation are not performed on the words between [[ and ]]. Each expression can be constructed from one or more of the following unary or binary expressions: string True, if string is not null. -a file Same as -e below. This is obsolete. -e file True, if file exists.
答え2
(または)のバイナリは、test
シェルに組み込まれているバイナリとは異なります。シェルのドキュメントを参照してください。シェルによっては、バイナリではなくシェル組み込み関数を呼び出すか、実際に呼び出すこともできます。以下は、AIXや対応するKSHではありませんが、サポートされていないかフラグがありますが、サポートされているGabo BourneシェルまたはMac OS Xでは、次のようになります。[
PATH
[[
[[
test
[
mksh
sh
[[
-a
mksh
$ sh
$ [[ -a /etc/passwd ]] && echo yea
[[: not found
$ [ -a /etc/passwd ] && echo yea
test: argument expected
$ exit
$ [[ -a /etc/passwd ]] && echo yea
yea
$ [ -a /etc/passwd ] && echo yea
yea
$