我想知道您是否可以为命令加上别名,并在同一行代码中使用它,请参见以下示例:
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__"
答案 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版本。