Définir un alias et l'utiliser immédiatement

11

Dans zshcela fonctionne bien:

alias foo=ls
foo

Mais cela ne signifie pas:

alias foo=ls; foo

Appuyez sur Entrée une fois de plus n'est pas un problème lors de l'exécution interactive. Mais lors de son exécution, sshcela devient soudainement un problème:

% ssh zsh@server 'alias foo=ls; foo'
zsh:1: command not found: foo

Même avec une nouvelle ligne, cela ne fonctionne pas:

% ssh zsh@server 'alias foo=ls;
foo'
zsh:2: command not found: foo

La chose étrange est que zshsait qu'elle est aliasée:

% ssh zsh@server 'alias foo=ls; alias'
foo=ls
run-help=man
which-command=whence

Comment dire zshque les alias doivent être actifs?

Ole Tange
la source
C'est un problème commun avec l'aliasing. Je l'ai essayé en utilisant bashet cshils se sont comportés de la même manière. J'espère que quelqu'un pourrait expliquer cela.
Slyx
Bash n'est pas un problème: le serveur ssh 'shopt -s expand_aliases; alias jj = ls \ njj'
Ole Tange

Réponses:

9

Tu ne peux pas le faire.

Étant donné que les alias n'ont été développés qu'après l'expansion de l'historique et que la ligne entière a été lue en une seule fois, donc quand il a fooété exécuté, le processus d'expansion des alias a disparu, il est trop tard pour que le shell reconnaisse un nouvel alias.

La meilleure façon de faire est de définir un alias dans .zshrcou d'utiliser une fonction comme la réponse de jimmij ou d'utiliser eval:

alias foo=ls; eval foo

Il y a un cas spécial avec zsh -c . Dans ce cas, les alias définis dans .zshenvseront développés.

cuonglm
la source
Cela n'expliquerait pas pourquoi ssh host 'alias foo=bar<newline>foo'cela ne fonctionne pas. Il y a un cas particulier pourzsh -c
Stéphane Chazelas
Ou utilisezalias foo=ls; eval foo
Stéphane Chazelas
@ StéphaneChazelas: Merci pour l'information mise à jour avec eux. À propos du sshcas, pourriez-vous s'il vous plaît clarifier les choses. Je pense que la commande a été lue en une seule fois.
cuonglm
10

C'est un problème très connu qui est même décrit dans le zshmanuel au chapitre ALIASING (voir man zshmisc). La manière recommandée de le traiter est d'utiliser la fonction au lieu de l'alias:

foo() { ls; } ; foo

ou encore mieux en cas de ls:

foo() { ls -- "${@:-.}"; } ; foo

ps. le point-virgule à la fin de la définition de la fonction (liste) et les espaces ne sont pas nécessaires dans zsh, mais comme d'habitude à partir d'autres shells, je les mets toujours.

jimmij
la source
1

Utilisation du c-shell (tcsh pour être exact) à partir de la ligne de commande:

mymachine % alias showme "echo here it is"
mymachine % showme
here it is

ou placez-le dans le fichier .cshrc puis sourcez le fichier:

mymachine % source ~/.cshrc

mymachine % showme
here it is

mymachine % ssh garnet showme
here it is
user3227618
la source