Nieinteraktywna powłoka rozwiń alias

12

Mam problem z rozszerzeniem aliasów na moim koncie hostingowym, gdy uruchamiam polecenie takie jak:

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

Mój plik .bashrc to:

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"

Kiedy uruchamiam powyższe polecenie ssh, widzę echo „.bashrc”. Ale jeśli spróbuję uruchomić aliasy, nic nie dostanę.

Mógłbym spróbować „bash -ic”, ale tak naprawdę jest to skrypt, którego nie mogę łatwo zmienić i chcę wiedzieć, dlaczego to nie działa.

Wyjście z 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

Wyjście z ssh user@server "bash -c \"echo $SHELL\""

.bashrc
/bin/bash
Matt
źródło
Zrezygnowałem i właśnie stworzyłem dowiązania symboliczne i skrypty w ~ / bin, które robią to samo, co chciałem z aliasami. Tak długo, jak eksportuję mój, $PATHponieważ ~/bin:$PATHdziała dobrze.
Matt
Na Ubuntu (16.04 i nowszych na pewno), jeśli masz ~/.local/bin, gdy /etc/profilesą przetwarzane automatycznie dodać, że do PATH. Możesz także zaraz . /etc/profilepo utworzeniu folderu, aby dodać go do PATH bez ponownego uruchamiania komputera lub wylogowywania / logowania.
dragon788,

Odpowiedzi:

15

Ze strony podręcznika bash(1):

Aliasy nie są rozwijane, gdy powłoka nie jest interaktywna, chyba że ustawiono opcję powłoki expand_aliases za pomocą shopt (patrz opis shopt w POLECENIA WBUDOWANE POWŁOKI poniżej).

szkarłatna czapla
źródło
5
Mam shopt -s expand_aliasesw moim .bashrc, ale to chyba nie działa. Nie jestem pewien, dlaczego nie, ale myślę, że to normalna odpowiedź
Matt
@Matt Nie jestem pewien kolejności „zdarzeń”, ale czy próbowałeś się upewnić, że przed aliasami shopt -s expand_aliasesjest w tobie .bashrc? Oczywiście, swoją moc w pokazach zapytania expand_aliasesjest off.
crimson-egret
Tak, zobacz .bashrc w moim pytaniu. Widzę linię echa, ale shoptpokazuje ją jako wyłączoną. Może jest to jakieś dziwne ustawienie serwera, które temu zapobiega, nie wiem. Mam obejście
Matt
prawdopodobnie .bashrcplik nie był domyślnie pozyskiwany.
Daniel Farrell
8

Powłoka, którą otrzymujesz, gdy zdalnie wykonujesz polecenie za pomocą SSH, nie jest ani powłoką interaktywną, ani powłoką logowania:

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

(w odpowiedzi nie ma iani nie l)

W przypadku Basha oznacza to, że nie są odczytywane żadne zwykłe pliki inicjujące.

Można wymusić zdalnej powłoki być powłokę logowania, dodając -ldo wywołania bash, co oznacza, że będzie analizować pierwszy jeden ~/.bash_profile, ~/.bash_logini ~/.profileże można go znaleźć, szukając w tej kolejności, ale nie ~/.bashrc. Oznacza to, że zamiast tego będziesz musiał umieścić swoje aliasy w jednym z tych plików.

Kusalananda
źródło
To brzmi jak rozwiązanie. Nawet nie używam już tego serwera, więc nie mogę go przetestować, ale prawdopodobnie warto to poprawić, jeśli ktoś inny znajdzie pytanie.
Matt
2

Miałem ten sam problem i na początku shopt -s expand_aliasesnie wydawałem się pomóc. Odkryłem, że te opcje należy ustawić przed dodaniem rzeczywistych aliasów. Więc jeśli aliasy są utworzone przed swoimi .bashrczestawami te expand_aliasesopcje, nie będą one dostępne. Dlatego po ustawieniu opcji należy załadować (lub ponownie załadować) aliasy.

Gene Pawłowski
źródło
0

bash (1) mówi

...

Po uruchomieniu interaktywnej powłoki, która nie jest powłoką logowania, bash czyta i wykonuje polecenia z ~ / .bashrc, jeśli plik istnieje.

...

Powłoka interaktywna to taka, która została uruchomiona bez argumentów nie będących opcjami i bez opcji -c, której standardowe wejście i błąd są podłączone do terminali (jak określono przez isatty (3)), lub jedna została uruchomiona z opcją -i.

tak więc albo źródłowy plik .bashrc ręcznie, albo uruchomić go za pomocą -i

jeśli aliasy są wszystkim, czego potrzebujesz, zaleciłbym ich podzielenie na np. .aliases, a następnie źródło tego z .bashrc i skryptu, na wypadek, gdyby coś wkradło się do .bashrc, co może zepsuć skrypt, jak to często bywa

Aleksandar Ivanisevic
źródło
więc widzę, że .bashrc jest pozyskiwany. Widzę linię echa z .bashrc po uruchomieniu polecenia. Problem polega na tym, że aliasy w tym pliku nie rozwijają się.
Matt
0

Możesz rozwiązać każdy problem, wprowadzając:

if [ -f /etc/skel/.bashrc ]; then . /etc/skel/.bashrc; fi

w pierwszej linii.

Riccardo La Marca
źródło