Alias ​​de développement de shell non interactif

12

J'ai du mal à obtenir des alias pour étendre mon compte d'hébergement lorsque j'exécute une commande comme:

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

Mon fichier .bashrc est:

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"

Lorsque j'exécute la commande ssh ci-dessus, je vois ".bashrc" en écho. Mais si j'essaie d'exécuter des alias, je ne reçois rien.

Je pourrais essayer "bash -ic", mais c'est en fait dans un script que je ne peux pas facilement changer, et je veux savoir pourquoi cela ne fonctionne pas.

Sortie 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

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

.bashrc
/bin/bash
Mat
la source
J'ai abandonné et je viens de créer des liens symboliques et des scripts dans ~ / bin qui font la même chose que je voulais avec les alias. Tant que j'exporte mon $PATHcar ~/bin:$PATHcela fonctionne bien.
Matt
Sur Ubuntu (16.04 et plus récent pour sûr) si vous en avez un ~/.local/binlorsque le /etc/profileest traité, il l'ajoutera automatiquement à votre PATH. Vous pouvez également juste . /etc/profileaprès avoir créé le dossier pour l'ajouter à votre PATH sans redémarrage ou déconnexion / connexion.
dragon788

Réponses:

15

Depuis la bash(1)page de manuel:

Les alias ne sont pas développés lorsque le shell n'est pas interactif, sauf si l'option shell expand_aliases est définie à l'aide de shopt (voir la description de shopt sous COMMANDES DE CONSTRUCTION D'INTERPRÉTEUR ci-dessous).

aigrette cramoisie
la source
5
J'en ai shopt -s expand_aliasesdans mon .bashrc, mais cela ne semble pas fonctionner. Je ne sais pas pourquoi, mais je suppose que ce serait la réponse normalement
Matt
@Matt Je ne suis pas sûr de l'ordre des «événements», mais avez-vous essayé de vous assurer que le shopt -s expand_aliasesest dans vos .bashrcavant les alias? Certes, votre sortie dans la question montre expand_aliasesest off.
crimson-egret
Oui, voyez le .bashrc dans ma question. Je vois la ligne d'écho mais la shoptmontre comme éteinte. Peut-être qu'il y a juste un paramètre de serveur étrange qui empêche cela, je ne sais pas. J'ai une solution
Matt
le .bashrcfichier n'était probablement pas fourni par défaut.
Daniel Farrell
8

Le shell que vous obtenez lorsque vous exécutez une commande à distance avec SSH n'est ni un shell interactif ni un shell de connexion:

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

(il n'y a pas iet pas ldans la réponse)

Dans le cas de Bash, cela signifie qu'aucun des fichiers d'initialisation habituels n'est lu.

Vous pouvez forcer le shell à distance pour être un shell de connexion en ajoutant -là votre appel Bash, ce qui signifie qu'il parser le premier de ~/.bash_profile, ~/.bash_loginet ~/.profilequ'il peut trouver, à la recherche dans cet ordre, mais non ~/.bashrc. Cela signifie que vous devrez plutôt placer vos alias dans l'un de ces fichiers.

Kusalananda
la source
Cela ressemble à la solution. Je n'utilise même plus ce serveur, je ne peux donc pas le tester, mais cela vaut probablement la peine de voter pour le cas où quelqu'un d'autre trouverait la question.
Matt
2

J'ai eu le même problème et, au début shopt -s expand_aliases, ne semblait pas aider. Ce que j'ai découvert, c'est que ces options doivent être définies avant d'ajouter les alias réels. Donc, si des alias sont créés avant que votre jeu ne .bashrcdéfinisse les expand_aliasesoptions, ils ne seront pas disponibles. Par conséquent, vous devez charger (ou recharger) les alias après avoir défini l'option.

Gene Pavlovsky
la source
0

bash (1) dit

...

Lorsqu'un shell interactif qui n'est pas un shell de connexion est démarré, bash lit et exécute les commandes à partir de ~ / .bashrc, si ce fichier existe.

...

Un shell interactif est un shell démarré sans arguments sans option et sans l'option -c dont l'entrée standard et l'erreur sont tous deux connectés aux terminaux (comme déterminé par isatty (3)), ou un ordinateur démarré avec l'option -i.

donc, évidemment, vous sourcez .bashrc manuellement ou vous l'exécutez avec -i

si les alias sont tout ce dont vous avez besoin, je recommanderais de les séparer par exemple en .aliases puis de les source à la fois.

Aleksandar Ivanisevic
la source
donc je vois que .bashrc provient. Je vois la ligne d'écho de .bashrc lorsque j'exécute la commande. Le problème est que les alias de ce fichier ne se développent pas.
Matt
0

Vous pouvez résoudre tout problème en entrant:

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

à la première ligne.

Riccardo La Marca
la source