Skip to content
Vidar Holen edited this page Apr 8, 2025 · 1 revision

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

Related resources:

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

ShellCheck

Each individual ShellCheck warning has its own wiki page like SC1000. Use GitHub Wiki's "Pages" feature above to find a specific one, or see Checks.

Clone this wiki locally