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?


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.


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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.