Chạy một lệnh bị che khuất bởi một bí danh


164

Giả sử tôi có bí danh sau trong bash - alias ls='ls --color=auto'- và tôi muốn gọi bình thường lsmà không có tùy chọn. Có phải cách duy nhất để làm điều đó là unalias, thực hiện lệnh và sau đó là bí danh? Hoặc có một số mẹo hay cách giải quyết khác?


2
Chỉ cần một lưu ý về một số câu trả lời dưới đây: "lệnh" là cách an toàn DUY NHẤT để thực hiện điều này. Ví dụ: "." hoặc "nguồn" tích hợp có thể bị ghi đè bởi hàm do tập lệnh xác định. "chỉ huy ." hoặc "nguồn lệnh" là cách duy nhất để thực thi nguồn một cách an toàn mà không có chức năng xác định tập lệnh được gọi thay thế. Không có lựa chọn thay thế nào khác, bao gồm phương thức dấu gạch chéo ngược "\.", Hoạt động và tất nhiên không có lựa chọn "/ bin / nguồn" nào mà bạn có thể gọi bằng cách chỉ định một đường dẫn đầy đủ.
Dejay Clayton

Câu trả lời:


211

Bạn cũng có thể thêm tiền tố vào dấu gạch chéo ngược để tắt bí danh: \ls

Chỉnh sửa: Các cách khác để làm tương tự bao gồm:

Sử dụng "lệnh": command lstheo Mikel .

Sử dụng đường dẫn đầy đủ: /bin/lstheo uther .

Trích dẫn lệnh: "ls"hoặc 'ls'theo bình luận của Mikel.

Bạn có thể xóa bí danh tạm thời cho phiên cuối cùng với unalias command_name.


Đây là cách tiêu chuẩn của tôi để làm điều này.
ncmathsadist

rất hay, cũng hoạt động tốt với tcsh
Levon

10
Cách này rất hữu ích. Nó chỉ bỏ qua các bí danh, không phải các chức năng, làm cho nó khác với commandhoặc builtin.
Mikel

1
Có vẻ như l\slàm điều tương tự. Là hành vi này là một lỗi hoặc một tính năng?
Niklas B.

4
Đó là một "tính năng". Chỉ các bí danh không trích dẫn được mở rộng. Vì vậy, bạn có thể đặt nó trong dấu ngoặc kép hoặc sử dụng dấu gạch chéo ngược bất cứ nơi nào bạn muốn. Xem tài liệu tham khảo bí danh bash .
Mikel

79

Đó là những gì commandlệnh dành cho.

Thử

command ls

Điều này nói với shell để bỏ qua các bí danh và chức năng.

Cách này được hỗ trợ bởi bash , zshash / dash.


2
Câu trả lời tốt nhất, tại sao nó không được nâng cao nhất, mặc dù? :) +1
0xC0000022L

11
Bởi vì nó thêm 8 lần số lượng ký tự như phương thức dấu gạch chéo ngược
JoelFan

1
@STATUS_ACCESS_DENIED Điều này cũng không hoạt động với tcsh (và do đó có lẽ không phải với csh). Phương thức `\` hiện
Levon

3
Tính năng dấu gạch chéo ngược không an toàn. Mặc dù nó cung cấp sự bảo vệ chống lại các bí danh có tên tương tự, nhưng nó không cung cấp sự bảo vệ chống lại các chức năng được đặt tên tương tự.
Dejay Clayton

2
@JoelFan Tôi muốn có nhiều nhân vật phụ hơn và các kịch bản của tôi dễ theo dõi và làm việc cho mọi người. Thay vì một dấu gạch chéo khó hiểu, không trực quan, dễ bỏ sót, không được ghi chép tốt và không hoạt động để bỏ qua các chức năng.
Dennis

19

Bí danh chỉ là một phím tắt được xác định. Trong ví dụ này, bí danh được định nghĩa là chuỗi ls, thực thi ls --color=auto. Nếu bạn không muốn hành vi đó, bạn có thể gọi nhị phân lsbằng đường dẫn tuyệt đối.

Vì vậy, thực thi chỉ /bin/lssẽ tạo ra đầu ra mà không có màu bởi vì nó không phải là bí danh bạn đã xác định.

Bạn cũng có thể thay đổi bí danh thành một cái gì đó khác hoặc thêm một bí danh mới thực thi lsmà không cần các tham số màu.


2
Bạn phải biết lệnh ở đâu. Trên một số hệ thống, sự phân chia giữa /bin/usr/binlà tùy ý.
Keith Thompson

@KeithThndry Đối với điều đó, bạn có thể sử dụng whichcho một số lệnh : which ls.
cst1992

@ cst1992: Nếu bạn sẽ sử dụng which(hoặc type), nó sẽ tra cứu qua $PATH; bạn cũng có thể chỉ sử dụng lshoặc \lsthay vì chỉ định đường dẫn.
Keith Thompson

10

Một cách khác, dựa trên câu trả lời của @ uther, là sử dụng $(which ...)hoặc `which ...`(sử dụng backticks ``) để tự động tìm đường dẫn của tệp thực thi. Điều này sẽ làm việc trong bash:

$(which ls)

`which ls`

Không còn nghi ngờ gì nữa, chỉ cần thêm tiền tố vào lệnh \ngắn hơn nhiều.

CẬP NHẬT : Theo Làm thế nào để sử dụng `which` trên một lệnh bí danh? , điều này dường như không đáng tin cậy chút nào.


Dấu ngoặc để làm gì? Tôi đoán bạn có nghĩa là `which ls`để thực hiện nhị phân trực tiếp.
amyassin

2
@amyassin: Cả hai cú pháp đều tương đương. (BTW, làm thế nào bạn có được backticks vào định dạng mã?)
krlmlr

Trên thực tế, công việc (which ls)này không phù hợp với tôi (trên Ubuntu 12.04 LTS) Và các backticks rất khó, tôi chỉ thoát được chúng: \ `mà ls \`. Phải mất rất nhiều chỉnh sửa để đến đó :)
amyassin

1
@ user946850 "Để bao gồm một ký tự backtick bằng chữ trong một khoảng mã, bạn có thể sử dụng nhiều backticks làm dấu phân cách mở và đóng". Nguồn: Tham khảo Markdown .
Mikel

@amyassin: Bạn đã thêm $?
krlmlr

2

Cá nhân, tôi chỉ tránh việc xác định các bí danh có cùng tên với các lệnh, vì vậy lsluôn gọi lệnh thực tế. Tôi có bí danh hoặc các chức năng cho các kết hợp khác nhau của các tùy chọn như l, ll, và lg. (Điều này có nghĩa là tôi cần unalias lstrong .bashrchoặc .cshrc.)

Tôi thấy rằng các giả định của HĐH về các tùy chọn mà tôi có thể thích (ghi đè các giả định của chính các nhà thiết kế lslệnh) hiếm khi phù hợp với sở thích cá nhân của tôi. Tôi tình cờ không thích vẻ ngoài của nó ls --color=auto, và mức độ dễ đọc của nó có thể khác nhau rất nhiều giữa đen trắng và trắng đen.

YMMV, và các giải pháp khác tất nhiên vẫn còn tốt để biết.


1

Nhập lệnh bằng chữ hoa dường như hoạt động LS, mặc dù tôi không thực sự chắc chắn tại sao.


4
Trong shell nào, hệ điều hành nào, thiết bị đầu cuối nào, v.v.?
Mikel

@Mikel Có một gói "sl" cung cấp "sl" là "ls". Các mẹo bash đưa ra trong Ubuntu cũng nói rằng "LS" được cung cấp bởi "sl".
Izkata

1
Đây là bash 4 (được cài đặt với Fink) trong Mac OS X 10.7. Nó cũng hoạt động cho các lệnh khác mà tôi đã đặt bí danh như rm và grep.
asmeker

3
Đó chỉ là một trò đùa :) từ trang mn:LS - display animations aimed to correct users who accidentally enter LS instead of ls.
amyassin

7
Tôi nghĩ rằng điều này hoạt động cho Mac OS X vì hệ thống tập tin của nó không phân biệt chữ hoa chữ thường. Nó sẽ không hoạt động trên các bản phối khác.
Jander
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.