Menentukan alias dan segera menggunakannya

11

Dalam zshhal ini berfungsi dengan baik:

alias foo=ls
foo

Tetapi ini tidak:

alias foo=ls; foo

Menekan masukkan waktu tambahan tidak menjadi masalah saat dijalankan secara interaktif. Tetapi ketika menjalankannya sshtiba-tiba menjadi masalah:

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

Bahkan dengan baris baru itu tidak berfungsi:

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

Yang aneh adalah yang zshtahu itu alias:

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

Bagaimana mengatakan zshbahwa alias harus aktif?

Ole Tange
sumber
Ini masalah umum dengan aliasing. Saya mencobanya menggunakan bashdan cshdan mereka berperilaku dengan cara yang sama. Saya harap seseorang bisa menjelaskannya.
Slyx
Bash bukan masalah: ssh server 'shopt -s expand_aliases; alias jj = ls \ njj'
Ole Tange

Jawaban:

9

Kamu tidak dapat melakukannya.

Karena alias diperluas hanya setelah ekspansi sejarah dan seluruh baris dibaca dalam sekali jalan, jadi ketika foodieksekusi, proses ekspansi alias hilang, sudah terlambat bagi shell untuk mengenali alias baru.

Cara terbaik yang dapat Anda lakukan adalah mendefinisikan alias di .zshrcatau menggunakan fungsi seperti jawaban jimmij atau menggunakan eval:

alias foo=ls; eval foo

Ada kasus khusus dengan zsh -c . Dalam hal ini, alias yang didefinisikan dalam .zshenvakan diperluas.

cuonglm
sumber
Itu tidak akan menjelaskan mengapa ssh host 'alias foo=bar<newline>foo'tidak berhasil. Ada kasus khusus untukzsh -c
Stéphane Chazelas
Atau gunakanalias foo=ls; eval foo
Stéphane Chazelas
@ StéphaneChazelas: Terima kasih atas informasinya, diperbarui bersama mereka. Soal sshkasing, bisakah Anda membuatnya lebih jelas. Saya pikir perintah itu masih dibaca dalam sekali jalan.
cuonglm
10

Ini adalah masalah yang sangat terkenal yang bahkan dijelaskan dalam zshmanual di bawah bab ALIASING (lihat man zshmisc). Cara yang disarankan untuk menghadapinya adalah dengan menggunakan fungsi alih-alih alias:

foo() { ls; } ; foo

atau bahkan lebih baik jika ls:

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

ps. titik koma di akhir definisi fungsi (daftar) dan spasi tidak diperlukan di zsh, tetapi sebagai kebiasaan dari kerang lain saya masih menempatkannya.

jimmij
sumber
1

Menggunakan c-shell (tcsh tepatnya) dari baris perintah:

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

atau letakkan di file .cshrc lalu sumber file:

mymachine % source ~/.cshrc

mymachine % showme
here it is

mymachine % ssh garnet showme
here it is
pengguna3227618
sumber