Dalam zsh
hal 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 ssh
tiba-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 zsh
tahu itu alias:
% ssh zsh@server 'alias foo=ls; alias'
foo=ls
run-help=man
which-command=whence
Bagaimana mengatakan zsh
bahwa alias harus aktif?
bash
dancsh
dan mereka berperilaku dengan cara yang sama. Saya harap seseorang bisa menjelaskannya.Jawaban:
Kamu tidak dapat melakukannya.
Karena alias diperluas hanya setelah ekspansi sejarah dan seluruh baris dibaca dalam sekali jalan, jadi ketika
foo
dieksekusi, proses ekspansi alias hilang, sudah terlambat bagi shell untuk mengenali alias baru.Cara terbaik yang dapat Anda lakukan adalah mendefinisikan alias di
.zshrc
atau menggunakan fungsi seperti jawaban jimmij atau menggunakaneval
:Ada kasus khusus dengan zsh -c . Dalam hal ini, alias yang didefinisikan dalam
.zshenv
akan diperluas.sumber
ssh host 'alias foo=bar<newline>foo'
tidak berhasil. Ada kasus khusus untukzsh -c
alias foo=ls; eval foo
ssh
kasing, bisakah Anda membuatnya lebih jelas. Saya pikir perintah itu masih dibaca dalam sekali jalan.Ini adalah masalah yang sangat terkenal yang bahkan dijelaskan dalam
zsh
manual di bawah bab ALIASING (lihatman zshmisc
). Cara yang disarankan untuk menghadapinya adalah dengan menggunakan fungsi alih-alih alias:atau bahkan lebih baik jika
ls
:ps. titik koma di akhir definisi fungsi (daftar) dan spasi tidak diperlukan di zsh, tetapi sebagai kebiasaan dari kerang lain saya masih menempatkannya.
sumber
Menggunakan c-shell (tcsh tepatnya) dari baris perintah:
atau letakkan di file .cshrc lalu sumber file:
sumber