【问题标题】:Aliasing a command and using it in the same line of code别名命令并在同一行代码中使用它
【发布时间】:2019-07-03 11:44:21
【问题描述】:

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

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__"

【问题讨论】:

  • a gitlab continuous integration script 批处理 shell 不支持别名(默认情况下)。只需php() { command /opt/plesk/php/7.3/bin/php "$@"; }

标签: linux bash centos


【解决方案1】:

我认为在执行任何操作之前正在解析命令行并应用别名。但是,您可以使用 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

【讨论】:

    【解决方案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 是一个命令。

    【讨论】:

      【解决方案3】:

      我选择了.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 版本。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-07-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-21
        • 1970-01-01
        • 2012-04-13
        • 1970-01-01
        相关资源
        最近更新 更多