Псевдоним команды и ее использование в одной строке кода - PullRequest
2 голосов
/ 03 июля 2019

Мне было интересно, можете ли вы использовать псевдоним команды и использовать ее в той же строке кода, см. Этот пример:

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 ]

3 голосов
/ 03 июля 2019

Я думаю, что командная строка анализируется и применяются псевдонимы, прежде чем что-либо будет выполнено.Однако вы можете сделать это с помощью функций оболочки.У меня нет 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интерпретируется позже в командной строке.Обратите внимание, что вам нужно ; до } - см. этот ответ .

Для вашего случая использования я бы рекомендовал использовать другое имя, чтобы избежать путаницы.Например:

currphp(){ /opt/plesk/php/5.6/bin/php "$@" ; } ; currphp -v
currphp(){ /opt/plesk/php/7.3/bin/php "$@" ; } ; currphp -v
2 голосов
/ 03 июля 2019

в скрипте непрерывной интеграции gitlab

Пакетные неинтерактивные оболочки не поддерживают псевдонимы (по умолчанию). И это хорошая мысль. alias следует использовать только как свои собственные, сокращенные, а не как отдельные записи.

Вы могли бы

a) определить функцию с тем же именем и использовать полный путь для разрешения команды:

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

Недостатки: функция не экспортируется, если вы не добавите export -f php, это функция оболочки. Что-то вроде xargs php будет работать неправильно.

б) используйте varaible.

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

Недостаток: вы должны изменить все сценарии и всегда проверять наличие $php.

в) Измените путь, чтобы ваш 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, он будет работать везде. Не забудьте удалить папку tho.

Примечание: вы не "псевдоним переменной", вы "псевдоним команды". alias позволяет заменить первое (и только первое) слово простой командой. php - это команда.

1 голос
/ 03 июля 2019

Я пошел с .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;

Это, похоже, помогло и дало мне правильную версию PHPпри использовании ssh xx@1.2.3.4 "php -v".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...