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

后端 未结 30 1958
有刺的猬
有刺的猬 2020-11-21 07:21

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\

相关标签:
30条回答
  • 2020-11-21 07:59

    If there isn't any external type command available (as taken for granted here), we can use POSIX compliant env -i sh -c 'type cmd 1>/dev/null 2>&1':

    # Portable version of Bash's type -P cmd (without output on stdout)
    typep() {
       command -p env -i PATH="$PATH" sh -c '
          export LC_ALL=C LANG=C
          cmd="$1"
          cmd="`type "$cmd" 2>/dev/null || { echo "error: command $cmd not found; exiting ..." 1>&2; exit 1; }`"
          [ $? != 0 ] && exit 1
          case "$cmd" in
            *\ /*) exit 0;;
                *) printf "%s\n" "error: $cmd" 1>&2; exit 1;;
          esac
       ' _ "$1" || exit 1
    }
    
    # Get your standard $PATH value
    #PATH="$(command -p getconf PATH)"
    typep ls
    typep builtin
    typep ls-temp
    

    At least on Mac OS X v10.6.8 (Snow Leopard) using Bash 4.2.24(2) command -v ls does not match a moved /bin/ls-temp.

    0 讨论(0)
  • 2020-11-21 08:00

    hash foo 2>/dev/null: works with Z shell (Zsh), Bash, Dash and ash.

    type -p foo: it appears to work with Z shell, Bash and ash (BusyBox), but not Dash (it interprets -p as an argument).

    command -v foo: works with Z shell, Bash, Dash, but not ash (BusyBox) (-ash: command: not found).

    Also note that builtin is not available with ash and Dash.

    0 讨论(0)
  • 2020-11-21 08:00

    This will tell according to the location if the program exist or not:

        if [ -x /usr/bin/yum ]; then
            echo "This is Centos"
        fi
    
    0 讨论(0)
  • 2020-11-21 08:01

    Expanding on @lhunath's and @GregV's answers, here's the code for the people who want to easily put that check inside an if statement:

    exists()
    {
      command -v "$1" >/dev/null 2>&1
    }
    

    Here's how to use it:

    if exists bash; then
      echo 'Bash exists!'
    else
      echo 'Your system does not have Bash'
    fi
    
    0 讨论(0)
  • 2020-11-21 08:01

    My setup for a Debian server:

    I had the problem when multiple packages contained the same name.

    For example apache2. So this was my solution:

    function _apt_install() {
        apt-get install -y $1 > /dev/null
    }
    
    function _apt_install_norecommends() {
        apt-get install -y --no-install-recommends $1 > /dev/null
    }
    function _apt_available() {
        if [ `apt-cache search $1 | grep -o "$1" | uniq | wc -l` = "1" ]; then
            echo "Package is available : $1"
            PACKAGE_INSTALL="1"
        else
            echo "Package $1 is NOT available for install"
            echo  "We can not continue without this package..."
            echo  "Exitting now.."
            exit 0
        fi
    }
    function _package_install {
        _apt_available $1
        if [ "${PACKAGE_INSTALL}" = "1" ]; then
            if [ "$(dpkg-query -l $1 | tail -n1 | cut -c1-2)" = "ii" ]; then
                 echo  "package is already_installed: $1"
            else
                echo  "installing package : $1, please wait.."
                _apt_install $1
                sleep 0.5
            fi
        fi
    }
    
    function _package_install_no_recommends {
        _apt_available $1
        if [ "${PACKAGE_INSTALL}" = "1" ]; then
            if [ "$(dpkg-query -l $1 | tail -n1 | cut -c1-2)" = "ii" ]; then
                 echo  "package is already_installed: $1"
            else
                echo  "installing package : $1, please wait.."
                _apt_install_norecommends $1
                sleep 0.5
            fi
        fi
    }
    
    0 讨论(0)
  • 2020-11-21 08:02

    Late answer but this is what I ended up doing.

    I just check if the command I execute returns an error code. If it returns 0 it means program is installed. Moreover you can use this to check the output of a script. Take for instance this script.

    foo.sh

    #!/bin/bash
    echo "hello world"
    exit 1 # throw some error code
    

    Examples:

    # outputs something bad... and exits
    bash foo.sh $? -eq 0 || echo "something bad happened. not installed" ; exit 1
    
    # does NOT outputs nothing nor exits because dotnet is installed on my machine
    dotnet --version $? -eq 0 || echo "something bad happened. not installed" ; exit 1
    

    Basically all this is doing is checking the exit code of a command run. the most accepted answer on this question will return true even if the command exit code is not 0.

    0 讨论(0)
提交回复
热议问题