Clone
1
SC2331
Vidar Holen edited this page 2025-04-08 10:22:01 -07:00

For file existence, prefer standard -e over legacy -a.

Problematic code:

if [ -a ~/.bash_aliases ]
then
  source ~/.bash_aliases
fi

Correct code:

if [ -e ~/.bash_aliases ]
then
  source ~/.bash_aliases
fi

Rationale:

The POSIX standard way to check whether a file exists is [ -e file ].

Bash and Ksh have historically allowed using -a, but this has no benefit and some potential downsides. For example, in Bash [ -a file ] is true when the file exists, but [ ! -a file ] is also true, and unconditionally so, because -a is treated as logical "and" between non-empty strings.

Avoid the ambiguity entirely by always using the standard, portable -e.

Exceptions:

None

  • Help by adding links to BashFAQ, StackOverflow, man pages, POSIX, etc!