Bir takma ad tanımlama ve hemen kullanma


11

Bu zshiyi çalışır:

alias foo=ls
foo

Ancak bu şunları yapmaz:

alias foo=ls; foo

Etkileşimli olarak çalışırken ekstra zaman girmek tuşuna basmak sorun değildir. Ama içinden geçerken sshaniden bir sorun haline gelir:

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

Yeni bir satırda bile çalışmaz:

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

Garip olan, zshbunun takma ad olduğunu bilmesi:

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

zshTakma adların etkin olması gerektiğini nasıl anlarsınız ?


Örtüşme ile ilgili yaygın bir sorundur. Kullanmayı denedim bashve cshaynı şekilde davrandılar. Umarım birisi bunu açıklayabilir.
Slyx

Bash bir sorun değil: ssh sunucusu 'shopt -s expand_aliases; takma ad jj = ls \ njj'
Ole Tange

Yanıtlar:


9

Bunu yapamazsın.

fooTakma adlar yalnızca geçmiş genişlemesinden sonra genişletildiğinden ve tüm satır tek seferde okunduğundan , takma yürütüldüğünde takma ad genişletme işlemi gitti, kabuğun yeni takma adı tanıması için çok geç.

Yapabileceğiniz en iyi yol, takma adı tanımlamak .zshrcveya jimmij'in yanıtı gibi bir işlevi kullanmak veya kullanmaktır eval:

alias foo=ls; eval foo

Bir var Zsh -c ile özel bir durum . Bu durumda, içinde tanımlanan takma adlar .zshenvgenişletilecektir.


Bu neden ssh host 'alias foo=bar<newline>foo'işe yaramıyor. Özel bir dava varzsh -c
Stéphane Chazelas

Veya kullanınalias foo=ls; eval foo
Stéphane Chazelas

@ StéphaneChazelas: Onlarla güncellenen bilgiler için teşekkürler. Hakkında sshdurumda, bunu daha açık hale misiniz. Bence komut hala bir seferde okundu.
cuonglm

10

Bu çok iyi bilinen bir problemdir ve zshALIASING (kılavuz) bölümünde kılavuzda bile anlatılmıştır man zshmisc. Bununla başa çıkmanın önerilen yolu, takma ad yerine işlevi kullanmaktır:

foo() { ls; } ; foo

veya şu durumlarda daha da iyi ls:

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

ps. fonksiyon tanımının (liste) sonundaki noktalı virgül ve boşluklara zsh'de gerek yoktur, ancak diğer kabuklardan gelen bir alışkanlık olarak hala onları koydum.


1

Komut satırından c-shell (tam olarak tcsh) kullanma:

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

veya .cshrc dosyasına koyun, ardından dosyayı kaynaklayın:

mymachine % source ~/.cshrc

mymachine % showme
here it is

mymachine % ssh garnet showme
here it is
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.