混淆命令并在同一行代码中使用它

时间:2019-07-03 11:44:21

标签: linux bash centos

我想知道您是否可以为命令加上别名,并在同一行代码中使用它,请参见以下示例:

alias php=/opt/plesk/php/5.6/bin/php; php -v;

我希望它输出PHP 5.6。

alias php=/opt/plesk/php/7.3/bin/php; php -v;

,我希望它输出PHP 7.3。但是,我得到的是:

php -v
# outputs 5.6

alias php=/opt/plesk/php/5.6/bin/php; php -v;
# outputs 5.6

alias php=/opt/plesk/php/7.3/bin/php; php -v;
# outputs 5.6

php -v
# outputs 7.3

我尝试过使用&&运算符,但结果相同。

我想在gitlab持续集成脚本中使用此脚本,该脚本通过传递字符串通过ssh -t执行脚本。但是我正在调用几个php函数,并且我不想每次都粘贴完整的php路径:

ssh -v -tt $SSH_HOST_NAME "__my_php_commands_here__"

3 个答案:

答案 0 :(得分:3)

我认为在执行任何操作之前,正在解析命令行并应用别名。但是,您可以使用shell函数来实现。我没有PHP,但是我有多个Perl版本可以测试:

$ perl -v |grep version                      #  V
This is perl 5, version 26, subversion 2 (v5.26.2) built for x86_64-cygwin-threads-multi

$ perl(){ /usr/bin/perl "$@" ; } ; perl -v |grep version
This is perl 5, version 26, subversion 3 (v5.26.3) built for x86_64-cygwin-threads-multi
                                             #  ^

因此定义传递功能

perl(){ /usr/bin/perl "$@" ; }

更改稍后在命令行中如何解释单词perl。请注意,您确实需要在;之前插入},请参阅this answer

对于您的用例,我建议使用其他名称以避免混淆。例如:

currphp(){ /opt/plesk/php/5.6/bin/php "$@" ; } ; currphp -v
currphp(){ /opt/plesk/php/7.3/bin/php "$@" ; } ; currphp -v

答案 1 :(得分:2)

  

在gitlab持续集成脚本中

批处理非交互式shell不支持别名(默认情况下)。这是一个好主意。 alias仅应用作您自己的自定义速记,而不能用于批量笔录。

您可以

a)定义一个具有相同名称的函数,并使用完整路径进行命令解析:

php() { /opt/plesk/php/5.6/bin/php "$@"; }
php -v

缺点:函数不会导出,除非您添加export -f php,否则它是一个shell函数。像xargs php之类的东西将无法正常工作。

b)使用变量。

php=/opt/plesk/php/5.6/bin/php
"$php" -v

缺点:您必须修改所有脚本,并始终签出$php

c)修改路径,以便首先找到您的php。您可以创建一个临时目录并将其添加到路径:

tmpd=$(mktemp -d)
trap 'rm -r "$tmpd"' EXIT
ln -s /opt/plesk/php/5.6/bin/php "$tmpd"/php
export PATH="$tmpd"/php:$PATH
php -v

如果您正确export PATH,它将在任何地方工作。记住要删除该文件夹。

侧面说明:您不是“别名变量”,而是“别名命令”。 alias允许您在一个简单的命令中替换第一个(也只有第一个)单词。 php是命令。

答案 2 :(得分:1)

我采用了.bashrc解决方案。我最初是从这个开始的,但是由于某种原因,别名没有被提取。看来您需要设置自定义的expand_aliases设置。

我的.bashrc最终看起来像这样:

shopt -s expand_aliases;

alias php=/opt/plesk/php/7.3/bin/php;
alias composer=/usr/lib64/plesk-9.0/composer.phar;

这似乎可以解决问题,并在使用ssh xx@1.2.3.4 "php -v"时为我提供了正确的PHP版本。