Неинтерактивная оболочка расширяет псевдоним

У меня возникли проблемы с получением псевдонимов для расширения моей учетной записи хостинга, когда я запускаю команду, например:

ssh user@server "bash -c \"alias\"" 

Мой файл .bashrc:

 echo .bashrc # .bashrc shopt -s expand_aliases # Source global definitions (commenting this out does nothing) if [ -f /etc/bashrc ]; then . /etc/bashrc fi # User specific aliases and functions alias php="php55" alias composer="php ~/bin/composer.phar" и echo .bashrc # .bashrc shopt -s expand_aliases # Source global definitions (commenting this out does nothing) if [ -f /etc/bashrc ]; then . /etc/bashrc fi # User specific aliases and functions alias php="php55" alias composer="php ~/bin/composer.phar" 

Когда я запускаю указанную выше команду ssh, я вижу «.bashrc» echo'd. Но если я пытаюсь запустить псевдонимы, я ничего не получаю.

Я мог бы попробовать «bash -ic», но на самом деле это сценарий, который я не могу легко изменить, и я хочу знать, почему это не работает.

Вывод ssh user@server "bash -c \"shopt\""

 .bashrc autocd off cdable_vars off cdspell off checkhash off checkjobs off checkwinsize off cmdhist on compat31 off compat32 off compat40 off dirspell off dotglob off execfail off expand_aliases off extdebug off extglob off extquote on failglob off force_fignore on globstar off gnu_errfmt off histappend off histreedit off histverify off hostcomplete on huponexit off interactive_comments on lithist off login_shell off mailwarn off no_empty_cmd_completion off nocaseglob off nocasematch off nullglob off progcomp on promptvars on restricted_shell off shift_verbose off sourcepath on xpg_echo off 

Вывод ssh user@server "bash -c \"echo $SHELL\""

 .bashrc /bin/bash 

Из bash(1) man:

Псевдонимы не расширяются, если оболочка не является интерактивной, если только опция shell_allases не установлена ​​с помощью shopt (см. Описание магазина в разделе SHELL BUILTIN COMMANDS ниже).

Оболочка, которую вы получаете, когда вы выполняете удаленную команду с SSH, не является ни интерактивной оболочкой, ни оболочкой входа:

 $ ssh server 'bash -c "echo $-"' chsB 

(в ответе нет i и нет l )

В случае с Bash это означает, что ни один из обычных файлов инициализации не читается.

Вы можете заставить удаленную оболочку быть оболочкой входа, добавив -l к вашему вызову Bash, что означает, что он будет анализировать первый из ~/.bash_profile , ~/.bash_login и ~/.profile который он может найти, поиск в этом порядке, но не ~/.bashrc . Это означает, что вам придется помещать свои псевдонимы в один из этих файлов.

bash (1) говорит

Когда запущена интерактивная оболочка, которая не является оболочкой входа, bash считывает и выполняет команды из ~ / .bashrc, если этот файл существует.

Интерактивная оболочка запускается без аргументов без опционов и без опции -c, стандартный ввод и ошибка которой соединены с терминалами (как определено isatty (3)), или один начинается с опции -i.

так что, очевидно, вы либо запускаете .bashrc вручную, либо запускаете его с -i

если псевдонимы – все, что вам нужно, я бы рекомендовал расщепить их, например, .aliases, а затем указать, что из обоих .bashrc и вашего скрипта, на всякий случай, что вся информация пробивается в .bashrc, что может нарушить ваш скрипт, как это часто бывает

У меня была та же проблема, и вначале не удалось помочь. Я обнаружил, что эти параметры должны быть установлены перед добавлением фактических псевдонимов. Поэтому, если псевдонимы создаются до того, как ваш .bashrc задает параметры expand_aliases , они не будут доступны. Поэтому вы должны загружать (или перезагружать) псевдонимы после установки опции.