xem lệnh mở rộng bí danh


67

Nếu một watchlệnh chạy có chứa bí danh, nó sẽ không mở rộng bí danh. Tôi đã thử cả hai với trích dẫn đơn và trích dẫn kép, trên thực tế đã đưa ra các bí danh sau:

# alias ll
alias ll='ls -l --color=tty'

Lệnh sau sẽ thất bại

# watch ll
sh: ll: command not found

Không nên ra lệnh mở rộng dòng trong trường hợp này?

Câu trả lời:


98

Các bí danh chỉ được mở rộng làm đối số đầu tiên hoặc sau một bí danh khác có dấu cách ở cuối lệnh.

Từ bash's help alias:

Một khoảng trắng ở VALUE làm cho từ tiếp theo được kiểm tra để thay thế bí danh khi bí danh được mở rộng.

Để làm điều này, hãy thử như sau:

alias watch='watch '
alias ll='ls -l --color=tty'
watch ll

Lưu ý rằng một số phiên bản watchdải màu theo mặc định, trên một số phiên bản, điều này có thể được dừng lại bằng cách sử dụng --colorhoặc -G.


1
Đây là câu trả lời hoàn toàn tuyệt vời! Cảm ơn và +1 tất nhiên.
ztank1013

1
Cảm ơn ... Trong tất cả thời gian này, tôi đã sử dụng 1. gõ ll, 2. nhấn ctrl + alt + e, 3. sau đó xem tiền tố. Đây là một tiết kiệm thời gian.
anishsane

10
Thật không may, phương thức này có một giới hạn mà bạn không thể cung cấp tùy chọn watchvì bí danh phải là từ tiếp theo, trong khi watchcần các đối số của nó trước khi lệnh chạy. Nếu bạn đã thử watch -n 10 <alias>, bash sẽ không mở rộng bí danh. Để làm việc xung quanh nó, bạn cần một bí danh bao gồm các tùy chọn bạn muốn (ví dụ: `alias watch-10 = 'watch -n 10'), vẫn có một khoảng trắng ở cuối.
indiv

2

Có lẽ chúng ta có thể tự mở rộng bí danh trước khi đồng hồ nhìn thấy nó?

watch $(alias ll | cut -d\' -f2)

Giải trình

Đầu ra của alias llhình như:

$ alias ll
alias ll='ls -lAGh'

Vì vậy, chúng tôi đặt dấu phân cách cắt thành trích dẫn đơn và cắt trường thứ 2, để lại:

ls -lAGh

tức là bí danh mở rộng. Điều đó sau đó hình thành các đối số được đưa ra watch.

Tạo một chức năng để làm điều đó

function watcha {
    watch $(alias "$@" | cut -d\' -f2)
}

Sau đó,

watcha ll

hoạt động như mong muốn. Điều này là khủng khiếp và sẽ thất bại trong tất cả các loại tình huống. Lấy làm tiếc.


0

Tôi nghĩ ở đây vấn đề cơ bản là trong khi thực thi watch, đối số được đưa ra cho " sh -c" có nghĩa là nếu bí danh llkhông được xác định trong sh(dash shell's)môi trường thì nó sẽ không mở rộng nó. Nhưng tôi đã sai và đây không phải là trường hợp, câu trả lời của Chris ở trên là đúng.


2
Không chính xác. Hãy thử watch 'alias ll="ls -l --color=tty"; type ll; ll'.
Chris Xuống

+1 để trả lời ngay lập tức để xác minh nó. Tôi đã sai ở trên.
Sachin Divekar

@ChrisDown, vì vậy ngay cả khi đồng hồ sử dụng " sh -c", lời giải thích của bạn cũng được áp dụng sh. Tôi có đúng không
Sachin Divekar

1
Điều đó phụ thuộc vào lớp vỏ nào đang được sử dụng sh. Lưu ý rằng điều này không hoạt động:sh -c $'alias ll="ls -l --color=tty"\ntype ll\nll'
Chris Down

0

Đã watchchạy một vỏ tương tác mới, sẽ mở rộng bí danh:

watch -x bash -i -c ll

(The -xnhằm ngăn chặn watchtừ việc sử dụng nó sở hữu sh -cđể quấn lệnh cho chúng tôi. Chúng tôi không muốn điều đó bởi vì chúng tôi cần phải vượt qua -iđể shhoặc bash, để làm cho nó một vỏ tương tác, mà đọc .bashrc và xác định bí danh. Với -x, đồng hồ thực thi lệnh sử dụng exec.)

Gah, thực sự, điều này không hoạt động. Sau khi hiển thị đầu ra của 'll' một lần, sau đó ngủ 2 giây, công việc sẽ được làm nền, với một chút bí ẩn:

1]+  Stopped                 watch -x bash -i -c ll

Tại sao nó dừng lại? Niềng răng mở đã [đi đâu? Tôi nghĩ đây sẽ là một câu trả lời tuyệt vời nhưng tôi không thể làm cho nó hoạt động được.

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.