查找可执行路径,无论它是别名还是命令
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'
我读到查找可执行文件的最佳方法是使用 type
或 command -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
我正在做一个 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'
我读到查找可执行文件的最佳方法是使用 type
或 command -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