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

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).


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.


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.


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


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.