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 S001. Use GitHub "Pages" feature above to find a specific one, or see Checks.

Clone this wiki locally