Псевдонім неінтерактивної оболонки


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" відлунюється. Але якщо я спробую запустити псевдоніми, я нічого не отримаю.

Я міг би спробувати "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)чоловіковій сторінці:

Псевдоніми не розгортаються, коли оболонка не є інтерактивною, якщо не встановлено параметр shell_aliases оболонки за допомогою shopt (див. Опис прострілу в SHELL BUILTIN COMMANDS нижче).


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)

У випадку Баша це означає, що жоден із звичайних файлів ініціалізації не читається.

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


Це звучить як рішення. Я навіть більше не використовую цей сервер, тому не можу перевірити його, але, мабуть, варто посилити це на випадок, якщо хтось інший знайде питання.
Метт

2

У мене була така ж проблема, і спочатку shopt -s expand_aliases, здавалося, не допомогло. Я дізнався, що ці параметри слід встановити перед додаванням власних псевдонімів. Таким чином , якщо створюються псевдоніми перед вашими .bashrcнаборами в expand_aliasesопціонах, вони не будуть доступні. Тому після установки опції слід завантажити (або перезавантажити) псевдоніми.


0

bash (1) каже

...

Коли запускається інтерактивна оболонка, яка не є оболонкою для входу, bash зчитує та виконує команди з ~ / .bashrc, якщо цей файл існує.

...

Інтерактивна оболонка - це запущена без аргументів неопціонування та без параметра -c, стандартний вхід і помилка як з'єднані з терміналами (як визначено isatty (3)), так і інша, розпочата з опції -i.

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

якщо псевдоніми все, що вам потрібно, я рекомендую розділити їх, наприклад.


тому я бачу, що .bashrc отримує джерело. Коли я запускаю команду, я бачу рядок ехо від .bashrc. Проблема полягає в тому, що псевдоніми у цьому файлі не розширюються.
Метт

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.