Linux проверить наличие команды

How can I check if a program exists from a Bash script?

How would I validate that a program exists, in a way that will either return an error and exit, or continue with the script? It seems like it should be easy, but it’s been stumping me.

What is a «program»? Does it include functions and aliases? which returns true for these. type without arguments will additionally return true for reserved words and shell builtins. If «program» means «excutable in $PATH «, then see this answer.

@TomHale It depends on which implementation of which you are using; which is not provided by Bash, but it is by e.g. Debian’s debianutils.

@jano Since the context is bash, type would be preferable over which , since we know that it is available. Howeever, both type and which do not detect, whether a program exists, but whether is is found in the PATH. To see whether a program of a certain name «exists» in a file system, you would have to use find .

39 Answers 39

Answer

if ! command -v &> /dev/null then echo " could not be found" exit fi 

For Bash specific environments:

hash # For regular commands. Or. type # To check built-ins and keywords 

Explanation

Avoid which . Not only is it an external process you’re launching for doing very little (meaning builtins like hash , type or command are way cheaper), you can also rely on the builtins to actually do what you want, while the effects of external commands can easily vary from system to system.

  • Many operating systems have a which that doesn’t even set an exit status, meaning the if which foo won’t even work there and will always report that foo exists, even if it doesn’t (note that some POSIX shells appear to do this for hash too).
  • Many operating systems make which do custom and evil stuff like change the output or even hook into the package manager.

So, don’t use which . Instead use one of these:

command -v foo >/dev/null 2>&1 || < echo >&2 "I require foo but it's not installed. Aborting."; exit 1; > 
type foo >/dev/null 2>&1 || < echo >&2 "I require foo but it's not installed. Aborting."; exit 1; > 
hash foo 2>/dev/null || < echo >&2 "I require foo but it's not installed. Aborting."; exit 1; > 

(Minor side-note: some will suggest 2>&- is the same 2>/dev/null but shorter – this is untrue. 2>&- closes FD 2 which causes an error in the program when it tries to write to stderr, which is very different from successfully writing to it and discarding the output (and dangerous!))

If your hash bang is /bin/sh then you should care about what POSIX says. type and hash ‘s exit codes aren’t terribly well defined by POSIX, and hash is seen to exit successfully when the command doesn’t exist (haven’t seen this with type yet). command ‘s exit status is well defined by POSIX, so that one is probably the safest to use.

Читайте также:  Opening ssh on linux

If your script uses bash though, POSIX rules don’t really matter anymore and both type and hash become perfectly safe to use. type now has a -P to search just the PATH and hash has the side-effect that the command’s location will be hashed (for faster lookup next time you use it), which is usually a good thing since you probably check for its existence in order to actually use it.

As a simple example, here’s a function that runs gdate if it exists, otherwise date :

gnudate() < if hash gdate 2>/dev/null; then gdate "$@" else date "$@" fi > 

Alternative with a complete feature set

You can use scripts-common to reach your need.

To check if something is installed, you can do:

checkBin || errorMessage "This tool requires . Install it please, and then run this tool again." 

Источник

Как проверить, существует ли программа в сценарии Bash

Когда вы вызываете команду из сценария оболочки в Linux, рекомендуется проверить, существует ли она в системе, на которой выполняется сценарий. Это поможет вам избежать ошибок и предотвратить завершение сценария. Таким образом, если команда не существует, вы сможете продолжить выполнение сценария без прерывания. В этой статье мы узнаем, как проверить, существует ли программа в сценарии оболочки.

Как проверить, существует ли программа в Bash Script

Вы можете легко проверить, существует ли команда или нет, используя ключевое слово command. Вот его синтаксис.

Приведенная выше команда возвращает true, если команда, указанная после опции -v, существует, в противном случае она вернет false.

Например, если вы хотите проверить, существует команда или нет, и вывести сообщение об ошибке, если команда не существует.

if ! command -v [программа] &> /dev/null then echo "[программа] не может быть найдена" exit fi

Кроме того, вы можете использовать команды hash и type, чтобы проверить, существуют ли команды и инструменты Linux или нет.

Или. Для проверки встроенных модулей и ключевых слов.

Как правило, многие разработчики и администраторы используют команду which для проверки существования или отсутствия команды.

Лучше использовать команды command, hash и type вместо команды which, потому что which — это внешняя команда, а остальные три команды — внутренние. Результат внутренних команд одинаков в большинстве систем, в то время как результат внешних команд варьируется от системы к системе.

Во многих операционных системах команда which даже не возвращает статус выхода, поэтому если вы используете ее в условии if, она всегда будет иметь значение true.

Вместо этого вы можете использовать команды command, hash и type, чтобы сделать то же самое. Вот примеры команд для проверки существования команды foo в вашей системе.

command -v foo >/dev/null 2>&1 || < echo >&2 "Мне требуется foo, но он не установлен. Прерываю."; exit 1; > type foo >/dev/null 2>&1 || < echo >&2 "Я требую foo, но он не установлен. Прерываю."; exit 1; > hash foo 2>/dev/null || < echo >&2 "Я требую foo, но он не установлен. Прерываю."; exit 1; >

Вот несколько моментов, о которых следует помнить при использовании хэша, типа и команды.

POSIX четко определяет вывод команды. Поэтому вы можете смело использовать его почти во всех скриптах. Но если ваш hash bang (среда выполнения) — /bin/sh, вам следует быть осторожным с использованием hash и type, поскольку их статус выхода не очень хорошо определен POSIX.

Читайте также:  Kaspersky update utility astra linux

Если ваш сценарий использует bash, то hash и type не имеют значения и оба совершенно безопасны для использования. На самом деле, type предоставляет опцию -P для прямого поиска путей к папкам, указанным в переменной PATH вашей системы, а hash автоматически хэширует путь команды для более быстрого поиска в следующий раз.

Вот простой пример запуска функции gdate, если она существует, в противном случае запускается функция date.

gnudate() < if hash gdate 2>/dev/null; then gdate "[email protected]" else date "[email protected]" fi >

Кроме того, вы можете использовать сторонние скрипты, такие как scripts-common, чтобы проверить, существует ли скрипт или нет. Вот его синтаксис.

checkBin [программа] || errorMessage "Этот инструмент требует [программа]". Установите его, пожалуйста, а затем запустите этот инструмент снова."

Заключение

В этой статье мы узнали, как проверить, существует ли программа или нет, и как добавить ее в условие if..else, чтобы продолжить выполнение скрипта в случае, если команда не существует.

Похожие записи:

Источник

Check if a Command Exists in Bash

Check if a Command Exists in Bash

  1. Use the command -v Command to Check if a Command Exists in Bash
  2. Use the type Command to Check if a Command Exists in Bash
  3. Use the hash Command to Check if a Command Exists in Bash
  4. Use the test Command 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.

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.

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.

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.

Читайте также:  Linux создать пользователя usr1cv8

This behavior is demonstrated below.

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.

In this case, the queries command is ls . Depending on your system, the output will be something like the below.

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.

  1. -b FILE — True if the file is a special block file.
  2. -c FILE — True if the file is a special character file.
  3. -d FILE — True if it is a directory.
  4. -e FILE — True if it is a file, regardless of type.
  5. -f FILE — True only if it is a regular file (e.g., not a directory or device).
  6. -G FILE — True if the file has the same group as the user executing the command.
  7. -h FILE — True if it is a symbolic link.
  8. -g FILE — True if it has the set-group-id ( sgid ) flag set.
  9. -k FILE — True if it has a sticky bit flag set.
  10. -L FILE — True if it is a symbolic link.
  11. -O FILE — True if it is owned by the user running the command.
  12. -p FILE — True if it is a pipe.
  13. -r FILE — True if it is readable.
  14. -S FILE — True if it is a socket.
  15. -s FILE — True if it has some nonzero size.
  16. -u FILE — True if the set-user-id ( suid ) flag is set.
  17. -w FILE — True if it is writable.
  18. -x FILE — True if 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 .

Related Article — Bash Command

Источник

Оцените статью
Adblock
detector