Alias ​​di espansione shell non interattivo


12

Ho problemi a far espandere gli alias sul mio account di hosting quando eseguo un comando come:

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

Il mio file .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"

Quando eseguo il comando ssh sopra, vedo ".bashrc" echo'd. Ma se provo a eseguire alias, non ottengo nulla.

Potrei provare "bash -ic", ma questo è in realtà in uno script che non posso facilmente cambiare, e voglio sapere perché non funziona.

Uscita di 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

Uscita di ssh user@server "bash -c \"echo $SHELL\""

.bashrc
/bin/bash

Ho rinunciato e ho appena creato collegamenti simbolici e script in ~ / bin che fanno la stessa cosa che volevo con gli alias. Finché posso esportare il mio $PATH, come ~/bin:$PATHfunziona bene.
Matt,

Su Ubuntu (16.04 e più recenti di sicuro) se hai un ~/.local/binquando /etc/profileviene elaborato, lo aggiungerà automaticamente al tuo PERCORSO. Puoi anche subito . /etc/profiledopo aver creato la cartella per aggiungerla al tuo PERCORSO senza riavviare o disconnettersi / accedere.
dragon788,

Risposte:


15

Dalla bash(1)pagina man:

Gli alias non vengono espansi quando la shell non è interattiva, a meno che l'opzione di shell expand_aliases sia impostata utilizzando shopt (vedere la descrizione di shopt sotto COMANDI INCORPORATI SHELL di seguito).


5
Ho shopt -s expand_aliasesnel mio .bashrc, ma non sembra funzionare. Non sono sicuro del perché, ma suppongo che questa sarebbe la risposta normalmente
Matt,

@Matt Non sono sicuro dell'ordine degli 'eventi', ma hai provato ad assicurarti che shopt -s expand_aliasessia nei tuoi .bashrcprima degli alias? Certamente, il tuo output nella domanda mostra expand_aliasesè off.
Crimson-Egret,

Sì, vedi il .bashrc nella mia domanda. Vedo la linea dell'eco ma la shoptmostra come disattivata. Forse c'è solo una strana impostazione del server che impedisce questo, non lo so. Ho una soluzione alternativa
Matt,

probabilmente il .bashrcfile non era di origine predefinita.
Daniel Farrell,

8

La shell che ottieni quando esegui un comando in remoto con SSH non è né una shell interattiva né una shell di login:

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

(non c'è ie no lnella risposta)

Nel caso di Bash ciò significa che nessuno dei soliti file di inizializzazione viene letto.

È possibile forzare la shell remota di essere una shell di login, aggiungendo -lalla vostra invocazione Bash, il che significa che sarebbe analizzare il primo dei ~/.bash_profile, ~/.bash_logine ~/.profileche riesce a trovare, la ricerca in questo ordine, ma non ~/.bashrc. Ciò significa che dovrai inserire i tuoi alias in uno di quei file.


Sembra la soluzione. Non sto nemmeno più usando questo server, quindi non posso provarlo, ma probabilmente vale la pena votarlo nel caso in cui qualcun altro trovi la domanda.
Matt,

2

Ho avuto lo stesso problema e all'inizio shopt -s expand_aliasesnon mi è sembrato d'aiuto. Quello che ho scoperto è che queste opzioni dovrebbero essere impostate prima di aggiungere gli alias effettivi. Pertanto, se gli alias vengono creati prima delle impostazioni .bashrcimpostate expand_aliases, non saranno disponibili. Pertanto, è necessario caricare (o ricaricare) gli alias dopo aver impostato l'opzione.


0

bash (1) dice

...

Quando viene avviata una shell interattiva che non è una shell di accesso, bash legge ed esegue i comandi da ~ / .bashrc, se quel file esiste.

...

Una shell interattiva è una avviata senza argomenti non opzionali e senza l'opzione -c i cui input ed errori standard sono entrambi collegati ai terminali (come determinato da isatty (3)), oppure uno avviato con l'opzione -i.

quindi, ovviamente, o .bashrc di origine manualmente o eseguirlo con -i

se tutti gli alias sono tutto ciò di cui hai bisogno, ti consiglio di dividerli in ad es. alias e quindi di procurarteli sia da .bashrc che dallo script, nel caso in cui qualcosa si insinui in .bashrc che potrebbe rompere il tuo script, come spesso accade


quindi vedo che .bashrc viene fornito. Vedo la riga dell'eco da .bashrc quando eseguo il comando. Il problema è che gli alias in quel file non si espandono.
Matt,

0

Puoi risolvere qualsiasi problema inserendo:

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

alla prima riga.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.