How to Check if a Command Exists in Bash
-
Use the
command -vCommand to Check if a Command Exists in Bash -
Use the
typeCommand to Check if a Command Exists in Bash -
Use the
hashCommand to Check if a Command Exists in Bash -
Use the
testCommand to Check if a Command Exists in Bash
There may be a need to validate whether a command, program, or file exists using Bash Scripting or programming.
This article will enlist multiple methods to fulfill that need.
We can use different built-in commands in Bash that allow us to check if a command exists or not. The use of these commands is demonstrated below.
Use the command -v Command to Check if a Command Exists in Bash
The command -v is a built-in function in all POSIX systems and Bash. This function checks if a command exists as it returns the valid path for that command if it does exist and returns NULL if it does not.
For example:
command -v ls
Output:
/bin/ls
The command -v can also be used safely in Bash scripts to check the existence of a command with if conditions, which is demonstrated below.
if ! [ -x "$(command -v npm)" ]; then
echo 'Error: npm is not installed.' >&2
exit 1
fi
The above code will check if npm is installed, i.e., exists within the user directory and if it is executable. If npm is not found on Path, the above code will raise an exception and terminate.
The template above can be used to check for the existence of any program/command/utility by using the name of that program/command/utility.
Use the type Command to Check if a Command Exists in Bash
The type command is a very useful built-in command that gives information about the entity it uses. It can be used with commands, files, keywords, shell built-ins, etc.
The use of the type command is shown below.
type command
Output:
command is a shell builtin
More specifically, for our use case, we can use the type command with the -p option to get the path of a file or executable. The use of this is demonstrated below.
type -p npm
Output:
/usr/local/bin/npm
Since npm was installed on our system, type -p has returned its valid path. It is important to note that if the type command (without any flags) is used with an entity that does not exist, it will raise an error; however, type -p in the same case will return NULL instead.
This behavior is demonstrated below.
type yarn
Output:
bash: type: yarn: not found
An error is returned as yarn is not installed on our system. However, type -p yarn returns no output; depending on how and why the existence of a program needs to be checked, the -p flag can be used or omitted.
Use the hash Command to Check if a Command Exists in Bash
The hash command works similarly to the type command. However, it exits successfully if the command is not found.
Furthermore, it has the added benefit of hashing the queried command resulting in a faster lookup.
The syntax for the command is as follows.
hash -t ls
In this case, the queries command is ls. Depending on your system, the output will be something like the below.
/usr/bin/ls
This is the file’s location that runs when the command is called. If the command is not found, e.g., when the query is something like: hash -t nothing, then the output will be like the below.
bash: hash: nothing: not found
The output is descriptive when the command is found and gives the added benefit of hashing the command for a faster search next time.
Use the test Command to Check if a Command Exists in Bash
test is a built-in shell command that is mainly used for comparisons and conditional statements; it can also be used to check for the existence of files and directories; it is important to note that test works only if the complete, valid path is provided of the file or directory you want to check.
There are a lot of option flags with the test command that relates to files and directories, and a list of these option flags is shown below.
It should be noted that these flags only return true if the file exists and the special condition is met. Below, you can find the special conditions listed.
-b FILE-Trueif the file is a special block file.-c FILE-Trueif the file is a special character file.-d FILE-Trueif it is a directory.-e FILE-Trueif it is a file, regardless of type.-f FILE-Trueonly if it is a regular file (e.g., not a directory or device).-G FILE-Trueif the file has the same group as the user executing the command.-h FILE-Trueif it is a symbolic link.-g FILE-Trueif it has theset-group-id(sgid) flag set.-k FILE-Trueif it has a sticky bit flag set.-L FILE-Trueif it is a symbolic link.-O FILE-Trueif it is owned by the user running the command.-p FILE-Trueif it is a pipe.-r FILE-Trueif it is readable.-S FILE-Trueif it is a socket.-s FILE-Trueif it has some nonzero size.-u FILE-Trueif theset-user-id(suid) flag is set.-w FILE-Trueif it is writable.-x FILE-Trueif it is executable.
In this example, FILE denotes the complete, valid path of a file that the user wants to check.
The use of a test to check for the existence of a file is shown below.
test -e etc/random.txt && echo "FILE exists."
The above code statement will check for the existence of the file etc/random.txt and output FILE exists if the test statement returns true.