Definieren Sie einen Alias ​​und verwenden Sie ihn sofort

11

In zshdieser funktioniert gut:

alias foo=ls
foo

Das geht aber nicht:

alias foo=ls; foo

Das Drücken einer zusätzlichen Zeit ist bei interaktiver Ausführung kein Problem. Aber beim Durchlaufen wird sshes plötzlich zum Problem:

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

Auch mit einer Newline funktioniert es nicht:

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

Das zshSeltsame ist, dass man weiß , dass es ein Alias ​​ist:

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

Wie können Sie feststellen, zshdass die Aliase aktiv sein sollten?

Ole Tange
quelle
Es ist ein häufiges Problem beim Aliasing. Ich habe es mit bashund versucht cshund sie haben sich genauso verhalten. Ich hoffe jemand konnte das erklären.
Slyx
Bash ist kein Problem: SSH-Server 'shopt -s expand_aliases; Alias ​​jj = ls \ njj'
Ole Tange

Antworten:

9

Du kannst das nicht machen.

Da Aliase erst nach der Verlaufserweiterung erweitert wurden und die gesamte Zeile auf einmal gelesen foowurde, war der Alias-Erweiterungsprozess bei Ausführung nicht mehr zu spät, damit die Shell einen neuen Alias ​​erkennt.

Der beste Weg, dies zu tun, besteht darin, einen Alias ​​in einer .zshrcFunktion wie jimmijs Antwort zu definieren oder diese zu verwenden oder Folgendes zu verwenden eval:

alias foo=ls; eval foo

Es gibt einen Sonderfall mit zsh -c . In diesem Fall werden die Aliase, in denen definiert wurde .zshenv, erweitert.

cuonglm
quelle
Das würde nicht erklären, warum ssh host 'alias foo=bar<newline>foo'es nicht funktioniert. Es gibt einen Sonderfall fürzsh -c
Stéphane Chazelas
Oder verwenden Siealias foo=ls; eval foo
Stéphane Chazelas
@ StéphaneChazelas: Danke für die Informationen, die mit ihnen aktualisiert wurden. Könnten sshSie bitte etwas klarer machen? Ich denke, der Befehl wurde immer noch auf einmal gelesen.
Cuonglm
10

Dies ist ein sehr bekanntes Problem, das sogar im zshHandbuch unter Kapitel ALIASING (siehe man zshmisc) beschrieben wird. Die empfohlene Art, damit umzugehen, besteht darin, die Funktion anstelle des Alias ​​zu verwenden:

foo() { ls; } ; foo

oder noch besser bei ls:

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

ps. Semikolon am Ende der Funktionsdefinition (Liste) und Leerzeichen werden in zsh nicht benötigt, aber als Gewohnheit von anderen Shells habe ich sie immer noch eingefügt.

jimmij
quelle
1

Verwenden der c-Shell (um genau zu sein tcsh) über die Befehlszeile:

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

oder legen Sie es in die .cshrc-Datei und geben Sie die Datei als Quelle ein:

mymachine % source ~/.cshrc

mymachine % showme
here it is

mymachine % ssh garnet showme
here it is
user3227618
quelle