运行脚本时如何强制使用特定的二进制文件

运行脚本时如何强制使用特定的二进制文件

执行 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.

相关内容