查找可执行路径,无论它是别名还是命令

Find executable path regardless if it is an alias or a command

我正在做一个 bash 脚本,它必须 运行 一个 php 文件。通常它会是 php file.php,但是我 运行 宁此脚本的服务器安装了 php 的许多版本(Plesk 服务器,许多项目,每个项目的不同版本...)

因此,对于命令行,有一些别名:

alias php7='/opt/plesk/php/7.4/bin/php'
alias php='/opt/plesk/php/8.0/bin/php'

我读到查找可执行文件的最佳方法是使用 typecommand -v,但在这种情况下它不会输出可执行文件的路径:

$ type php
php is aliased to `/opt/plesk/php/8.0/bin/php'
$ command -v php
alias php='/opt/plesk/php/8.0/bin/php'

我需要找到 php 可执行文件的路径,无论它是别名、实际可执行文件还是其他什么。问题是现在,如果我在我的脚本中 运行 php file.php 我得到这个:

$ ./test
./test: line 9: php: command not found

有什么帮助吗?谢谢!!

更新:这是我正在做的脚本内容:

#!/usr/bin/env bash

SCRIPT_DIR="$( pwd )"
CLI_FILE="${SCRIPT_DIR}/ofw/vendor/cli/cli.php"

PHP_FILE="$( which php )"

if test -f "$CLI_FILE"; then
        php $CLI_FILE
else
        echo "ERROR: OFW CLI must be run in a OFW project folder."
fi

如果 ./test 是 shell 脚本,请注意您的别名对它不可用。

除非你真的要求它:

shopt -s expand_aliases
source ~/.bashrc         # or whatever file defines your aliases.

php file.php             # should now work

但是,更简单的方法是将php目录添加到脚本的PATH

PATH=/opt/plesk/php/8.0/bin/php:$PATH

php file.php

通用方法。这假设用户的 shell 是 bash.

setupTool() {
    local tool=
    if ! [[ $tool =~ ^[[:alnum:]._-]+$ ]]; then
        echo "Malicious input: '$tool'" >&2
        return 1
    fi
    case "$( bash -ic "type -t $tool" )" in
        alias)
            shopt -s expand_aliases
            eval "$( bash -ic "alias $tool" )"
            ;;
        function)
            eval "$( bash -ic "declare -f $tool" )"
            ;;
        file|builtin|keyword)
            : ;; # no-op
        *)  echo "error: don't know about $tool" >&1
            return 1
            ;;
    esac
}

setupTool php || exit 1
php file.php