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


12

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

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"

Когда я запускаю указанную выше команду 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

Я отказался и просто создал символические ссылки и скрипты в ~ / bin, которые делают то же самое, что я хотел с псевдонимами. До тех пор , как я Экспортировать , $PATHкак ~/bin:$PATHэто работает хорошо.
Мэтт

В Ubuntu (16.04 и новее наверняка), если у вас есть ~/.local/binвремя /etc/profileобработки, оно автоматически добавит это в вашу переменную PATH. Вы также можете сразу . /etc/profileпосле создания папки добавить ее в PATH без перезагрузки или выхода из системы / входа в систему.
dragon788

Ответы:


15

Со bash(1)страницы руководства :

Псевдонимы не раскрываются, когда оболочка не является интерактивной, если только параметр оболочки expand_aliases не установлен с помощью shopt (см. Описание shopt в разделе «Команды SHELL BUILTIN» ниже).


5
У меня есть shopt -s expand_aliases.bashrc, но это не похоже на работу. Я не уверен, почему нет, но я думаю, что это будет нормальный ответ
Мэтт

@Matt Я не уверен, что порядок «событий», но вы пытались убедиться, что shopt -s expand_aliasesв ваших .bashrcдо псевдонимов? Конечно, ваш выход в вопросе показывает , expand_aliasesесть off.
малиновый цапля

Да, смотрите .bashrc в моем вопросе. Я вижу линию эха, но shoptпоказывает, что она отключена. Может быть, есть какая-то странная настройка сервера, которая мешает этому, я не знаю. У меня есть обходной путь
Мэтт

вероятно, .bashrcфайл не был получен по умолчанию.
Даниэль Фаррелл

8

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

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

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

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

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


Это звучит как решение. Я даже больше не пользуюсь этим сервером, поэтому не могу его протестировать, но, вероятно, стоит проголосовать за это, если кто-то другой найдет вопрос.
Мэтт

2

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


0

Баш (1) говорит

...

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

...

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

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

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


так что я вижу, что .bashrc в поиске. Когда я запускаю команду, я вижу строку эха от .bashrc. Проблема в том, что псевдонимы в этом файле не раскрываются.
Мэтт

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.