Alias ​​expandibles de shell no interactivo

12

Tengo problemas para obtener alias para expandir mi cuenta de hosting cuando ejecuto un comando como:

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

Mi archivo .bashrc es:

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"

Cuando ejecuto el comando ssh anterior, veo ".bashrc" echo'd. Pero si trato de ejecutar alias, no obtengo nada.

Podría intentar "bash -ic", pero en realidad está en un script que no puedo cambiar fácilmente, y quiero saber por qué esto no funciona.

Salida de 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

Salida de ssh user@server "bash -c \"echo $SHELL\""

.bashrc
/bin/bash
Mate
fuente
Me di por vencido y acabo de crear enlaces simbólicos y scripts en ~ / bin que hacen lo mismo que quería con los alias. Mientras exporte mi $PATHya ~/bin:$PATHque funciona bien.
Matt
En Ubuntu (16.04 y posterior), si tiene un ~/.local/bincuando /etc/profilese procesa, lo agregará automáticamente a su RUTA. También puede justo . /etc/profiledespués de crear la carpeta para agregarla a su RUTA sin reiniciar o cerrar sesión / iniciar sesión.
dragon788

Respuestas:

15

Desde la bash(1)página del manual:

Los alias no se expanden cuando el shell no es interactivo, a menos que la opción del shell expand_aliases se configure usando shopt (consulte la descripción de shopt en SHELL BUILTIN COMMANDS a continuación).

garceta carmesí
fuente
55
Tengo shopt -s expand_aliasesen mi .bashrc, pero eso no parece funcionar. No estoy seguro de por qué no, pero supongo que esta sería la respuesta normalmente
Matt
@ Matt No estoy seguro del orden de los 'eventos', pero ¿trataste de asegurarte de que shopt -s expand_aliasesesté en tu .bashrcantes de los alias? Ciertamente, su salida en la pregunta muestra expand_aliaseses off.
Garceta Roja
Sí, mira el .bashrc en mi pregunta. Veo la línea de eco pero la shoptmuestra apagada. Tal vez solo haya alguna configuración de servidor extraña que evite esto, no lo sé. Tengo una solución alternativa
Matt
probablemente el .bashrcarchivo no se obtuvo de forma predeterminada.
Daniel Farrell
8

El shell que obtienes cuando ejecutas un comando de forma remota con SSH no es un shell interactivo ni un shell de inicio de sesión:

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

(no hay iy no len la respuesta)

En el caso de Bash, eso significa que no se lee ninguno de los archivos de inicialización habituales.

Puede forzar el shell remoto a ser un intérprete de ingreso mediante la adición -la su invocación Bash, lo que significa que sería analizar el primero de ~/.bash_profile, ~/.bash_loginy ~/.profileque se pueda encontrar, buscando en ese orden, pero no ~/.bashrc. Esto significa que deberá colocar sus alias en uno de esos archivos.

Kusalananda
fuente
Esto suena como la solución. Ya ni siquiera estoy usando este servidor, así que no puedo probarlo, pero probablemente valga la pena votar en caso de que alguien más encuentre la pregunta.
Matt
2

Tuve el mismo problema, y ​​al principio shopt -s expand_aliasesno parecía ayudar. Lo que descubrí es que estas opciones deben establecerse antes de agregar los alias reales. Entonces, si se crean alias antes de que .bashrcestablezca las expand_aliasesopciones, no estarán disponibles. Por lo tanto, debe cargar (o volver a cargar) alias después de configurar la opción.

Gene Pavlovsky
fuente
0

bash (1) dice

...

Cuando se inicia un shell interactivo que no es un shell de inicio de sesión, bash lee y ejecuta comandos desde ~ / .bashrc, si ese archivo existe.

...

Un shell interactivo es uno que se inicia sin argumentos sin opciones y sin la opción -c cuya entrada estándar y error están conectados a los terminales (según lo determinado por isatty (3)), o uno que se inicia con la opción -i.

entonces, obviamente, usted obtiene .bashrc manualmente o lo ejecuta con -i

Si todo lo que necesita son alias, recomendaría dividirlos en, por ejemplo, .alias y luego obtenerlos de .bashrc y de su script, en caso de que las cosas se deslicen en .bashrc que pueden romper su script, como sucede a menudo

Aleksandar Ivanisevic
fuente
así que veo que se está obteniendo .bashrc. Veo la línea de eco de .bashrc cuando ejecuto el comando. El problema es que los alias en ese archivo no se expanden.
Matt
0

Puede resolver cualquier problema ingresando:

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

en la primera linea.

Riccardo La Marca
fuente