执行 bash 脚本时如何强制使用特定的二进制文件?
我有一个使用“php”二进制文件的 bash 脚本。
我的电脑上有几个php版本。通过 PATH 变量配置的主 php 二进制文件不是本例中使用的二进制文件。
通常情况下,脚本会像这样执行:
./script.sh
我需要这样的东西:
php=/usr/bin/php ./script.sh
注意:不能只为此命令临时更改 PATH 变量,因为这会影响其他依赖项。
在脚本中对其进行硬编码也不是一种选择,因为该脚本是由多人使用的。因此,当其他人执行脚本时,它应该只使用 PATH 变量中指定的主 php 二进制文件。
我不希望它可以通过变量访问。我实际上想指定查找二进制文件的确切位置。就像通常使用 PATH 所做的那样,现在仅适用于具有绝对路径的单个二进制文件。如果此脚本调用另一个脚本,则第二个脚本也需要使用该 php 版本。 –
答案1
这会起作用:
php() { /path/to/your/php $@; }; export -f php; ./script.sh ; unset -f php
分解它:
php() { /path/to/your/php $@; };
定义一个 shell 函数,它将把它的所有参数传递给您提供的 php 路径。
export -f php
导出新创建的函数以在脚本中使用
./script.sh
执行你的脚本
unset -f php
删除我们之前定义的 shell 函数。
答案2
一种方法是向脚本中添加一个附加变量:
PHP=$1
if [ -z $PHP ]; then
PHP=php
fi
然后,如果您在不指定任何内容的情况下运行它,它将使用默认的 PHP 二进制文件。否则,它将使用您将通过变量传递的那个
./script.sh /usr/bin/php
答案3
$ hash /usr/local/bin php
$ php file.php
帮助 :
$ LANG=C help hash
hash: hash [-lr] [-p pathname] [-dt] [name ...]
Remember or display program locations.
Determine and remember the full pathname of each command NAME. If
no arguments are given, information about remembered commands is displayed.
Options:
-d forget the remembered location of each NAME
-l display in a format that may be reused as input
-p pathname use PATHNAME is the full pathname of NAME
-r forget all remembered locations
-t print the remembered location of each NAME, preceding
each location with the corresponding NAME if multiple
NAMEs are given
Arguments:
NAME Each NAME is searched for in $PATH and added to the list
of remembered commands.
Exit Status:
Returns success unless NAME is not found or an invalid option is given.
答案4
你说注意:不能只为此命令临时更改 PATH 变量,因为这会影响其他依赖项,但我认为如果你做得对的话,这是一个选择。
您可以创建一个个人目录,其中包含仅有的您想要的php
,并将该个人目录放在您自己的 PATH 中的第一个目录中。该个人 PATH 条目将影响 shell 仅查找该php
二进制文件,而不影响任何其他 PATH 依赖项。运行该脚本的其他人不会使用您的 PATH,因此不会影响他们。例如:
$ mkdir -p "$HOME/myphp"
$ ln -s /usr/bin/php "$HOME/myphp/"
$ PATH=$HOME/myphp:$PATH
$ ./script.sh
上述方法只影响一个php
程序,对其他程序没有影响,而且只对你有影响,对其他任何人都没有影响。
当然,您可以将新的 PATH 定义放入您帐户的 shell 启动文件中,这样只有您运行的命令才会使用此版本的php
.