Xác định bí danh và sử dụng ngay lập tức


11

Trong zshnày hoạt động tốt:

alias foo=ls
foo

Nhưng điều này không:

alias foo=ls; foo

Nhấn enter thêm thời gian không phải là vấn đề khi chạy tương tác. Nhưng khi chạy qua sshnó đột nhiên trở thành một vấn đề:

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

Ngay cả với một dòng mới, nó không hoạt động:

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

Điều kỳ lạ là zshnó được đặt bí danh:

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

Làm thế nào để nói zshrằng các bí danh nên được hoạt động?


Đây là một vấn đề phổ biến với răng cưa. Tôi đã thử nó sử dụng bashcshvà họ cư xử theo cùng một cách. Tôi hy vọng ai đó có thể giải thích điều đó.
Slyx 17/08/2015

Bash không phải là vấn đề: ssh server 'shopt -s extend_aliases; alias jj = ls \ njj'
Ole Tange

Câu trả lời:


9

Bạn không thể làm điều đó.

Bởi vì các bí danh chỉ được mở rộng sau khi mở rộng lịch sử và toàn bộ dòng được đọc trong một lần, do đó, khi foođược thực thi, quá trình mở rộng bí danh đã biến mất, quá muộn để trình bày nhận ra bí danh mới.

Cách tốt nhất bạn có thể làm là xác định bí danh trong .zshrchoặc sử dụng chức năng như câu trả lời của jimmij hoặc sử dụng eval:

alias foo=ls; eval foo

Có một trường hợp đặc biệt với zsh -c . Trong trường hợp này, những bí danh đã được xác định trong .zshenvsẽ được mở rộng.


Điều đó sẽ không giải thích tại sao ssh host 'alias foo=bar<newline>foo'không hoạt động. Có một trường hợp đặc biệt chozsh -c
Stéphane Chazelas

Hoặc sử dụngalias foo=ls; eval foo
Stéphane Chazelas

@ StéphaneChazelas: Cảm ơn thông tin, đã cập nhật với họ. Về sshtrường hợp, bạn có thể vui lòng làm cho nó rõ ràng hơn. Tôi nghĩ rằng lệnh vẫn được đọc trong một lần.
cuonglm

10

Đây là vấn đề rất nổi tiếng, thậm chí được mô tả trong zshsách hướng dẫn theo chương ALIASING (xem man zshmisc). Cách xử lý được đề xuất là sử dụng hàm thay vì bí danh:

foo() { ls; } ; foo

hoặc thậm chí tốt hơn trong trường hợp ls:

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

ps. dấu chấm phẩy ở cuối định nghĩa hàm (danh sách) và khoảng trắng không cần thiết trong zsh, nhưng như một thói quen từ các shell khác tôi vẫn đặt chúng.


1

Sử dụng c-shell (chính xác là tcsh) từ dòng lệnh:

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

hoặc đặt nó trong tệp .cshrc, sau đó nguồn tệp:

mymachine % source ~/.cshrc

mymachine % showme
here it is

mymachine % ssh garnet showme
here it is
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.