Làm cách nào để buộc một từ Bash tham chiếu bí danh, hàm, tệp, v.v?


13

Khi cố gắng thêm một chút chi tiết vào một câu hỏi liên quan , tôi nhận ra rằng tôi không biết cách chỉ định một trong những loại từ Bash có sẵn để thực thi. Theo help typecó năm loại từ:

  • bí danh
  • từ khóa
  • chức năng
  • được xây dựng trong
  • tập tin

Một từ có thể có một vài loại ( truechỉ là một ví dụ; một từ thường được ghi đè hơn sẽ là cd):

$ type -a true
true is a shell builtin
true is /bin/true

Làm thế nào để bạn buộc thực hiện một từ đồng nghĩa cụ thể? Cho đến nay, theo thứ tự ưu tiên:

  • bí danh: Đây là một trường hợp đặc biệt vì nó được ưu tiên hơn tất cả các từ đồng nghĩa khác. Buộc điều này sẽ chỉ hữu ích khi lệnh sẽ thất bại nếu bí danh không được xác định.

    $ 
  • từ khóa:

    $ 
  • chức năng:

    $ 
  • được xây dựng trong:

    $ builtin true
  • tập tin:

    $ command true
    $ $(which true)
    $ /bin/true
    

Giải pháp từng phần :

  • Trích dẫn một từ không bao gồm bí danh và từ khóa. Đó là,

    $ 'true'

    sẽ chỉ chạy chức năng, dựng sẵn hoặc tập tin.

Câu trả lời:


10

Những gì bạn đang hỏi không thực sự có ý nghĩa nhiều.

từ khóa có nghĩa là một từ là một phần của cú pháp của shell. Những người được công nhận thông qua tokenising. Trích dẫn chúng là đủ để vỏ ngừng nhận ra.

Có thể đặt bí danh cho một từ khóa trong hầu hết các shell. Vì vậy, các bí danh được ưu tiên hơn các từ khóa (thực tế chúng được mở rộng sớm và có nhiều mã thông báo hơn sau đó bạn có thể có nhiều bí danh, từ khóa) ...

bí danh (ngoại trừ các bí danh zsh được xác định alias -gchỉ được mở rộng ở vị trí lệnh), vì vậy thường không có trong builtin the-alias.

các hàm được ưu tiên hơn các nội dung và các nội dung trên các lệnh bên ngoài (và sau đó $PATHquyết định sử dụng hàm nào).

Bạn có thể buộc nội dung với:

builtin the-cmd and its args

(mặc dù cần lưu ý rằng nó không phải là một lệnh tiêu chuẩn).

Bạn có thể vô hiệu hóa các bí danh bằng cách trích dẫn chúng (mặc dù phiên bản được trích dẫn cũng có thể được đặt bí danh trong một số shell).

Vì vậy, ví dụ (ở đây cú pháp zsh), trong:

'while'() echo function while
alias 'while=echo alias while'

Viết while truethực sự sẽ xuất ra alias while true, và sẽ không có cách nào để sử dụng whiletừ khóa vì trích dẫn nó sẽ vô hiệu hóa cả bí danh và từ khóa.

Bạn sẽ gọi whilehàm với ví dụ:

'whi'le whatever

Nếu có một whilenội trang (nhưng tất nhiên chúng sẽ không có trong các vỏ có whiletừ khóa), bạn sẽ viết nó:

builtin while whatever

Và để gọi whilelệnh, bạn sẽ viết:

env while whatever

hoặc trong zsh(khi không trong shthi đua):

command while whatever 

(trong các shell khác, commandchỉ ngăn chặn các chức năng, không phải nội dung)

Hoặc là

/full/path/to/while whatever

Tất nhiên, không có gì ngăn cản bạn làm những việc thậm chí còn tệ hại hơn như:

alias 'while=while "w"hile; do'
"while"() { while "whi"le; done; }

Mà, ít nhất trong zsh là hợp lệ (nhưng ngu ngốc).


Trích dẫn ngăn chặn tra cứu bí danh và command loại bỏ tra cứu chức năng, nhưng cả hai đều không chỉ định từ đồng nghĩa còn lại nào sẽ được sử dụng. Tôi đang tìm cách để chỉ định chỉ thực hiện một từ đồng nghĩa cụ thể .
l0b0

@ l0b0 "lệnh" triệt tiêu tất cả bí danh, từ khóa và nội dung.
Stéphane Chazelas

Về ý nghĩa, builtinđược sử dụng trong ví dụ RVM để ghi đè cdcho hiệu ứng đẹp.
l0b0

Bạn đúng; và tôi chỉ xác minh rằng nó cũng triệt tiêu các chức năng. +1.
l0b0

0

Một thành ngữ cực kỳ hữu ích cho tôi là:

FALSE=1; TRUE=0
DEVEL_FLAG=$FALSE
...
in_development() { return $DEVEL_FLAG ; }
cd()
{
 if in_development ; then # -D argument to script toggles development flag
   echo "Would run cd $*"
  else
   builtin cd "$@"
 fi
}

Bây giờ nếu tôi chạy tập lệnh với -D được chỉ định, chế độ phát triển được kích hoạt và cd (hoặc bất kỳ lệnh được gói nào khác) lặp lại thông tin gỡ lỗi

Điều này đặc biệt hữu ích với các tập lệnh chạy ssh. Chắc chắn tôi có thể chuyển đổi tập -x, nhưng điều này hữu ích và dễ đọc hơn đối với tôi.


1
Làm thế nào để trả lời câu hỏi này?
l0b0
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.