Liệt kê tất cả các lệnh mà trình bao biết


32

Tôi có thể gõ gì vào trình bao của mình (điều này xảy ra bash) sẽ liệt kê tất cả các lệnh được nhận dạng?

Ngoài ra, điều này khác nhau bởi vỏ? Hay tất cả các shell chỉ có một "thư mục" các lệnh mà chúng nhận ra?

Thứ hai, câu hỏi khác nhau, nhưng làm thế nào tôi có thể ghi đè bất kỳ câu hỏi nào? Nói cách khác, làm thế nào tôi có thể viết viewlệnh của riêng mình để thay thế lệnh hiện có trên hệ thống Ubuntu của tôi, có vẻ như chỉ tải vim.


5
Xin đừng kết hợp câu hỏi. Đăng mỗi một như một câu hỏi riêng biệt.
terdon

Gần như trùng lặp của unix.stackexchange.com/q/63073/135943 (Tôi đã liên kết theo cả hai hướng.)
Wildcard

Câu trả lời:


61

Bạn có thể dùngcompgen

compgen -c # will list all the commands you could run.

Tài chính

compgen -a # will list all the aliases you could run.
compgen -b # will list all the built-ins you could run.
compgen -k # will list all the keywords you could run.
compgen -A function # will list all the functions you could run.
compgen -A function -abck # will list all the above in one go.

4
Lưu ý rằng compgen -csẽ bao gồm những thứ như {hoặc whileđó không phải là lệnh nghiêm chỉnh.
Stéphane Chazelas

13

Một shell biết bốn loại lệnh.

  • Bí danh: đây là những biệt danh cho một lệnh với một số tùy chọn. Chúng được định nghĩa trong tệp khởi tạo của shell ( ~/.bashrcđối với bash).
  • Hàm: chúng là các đoạn mã shell được đặt tên. Giống như bí danh, chúng được định nghĩa trong tệp khởi tạo của shell.
  • Nội dung: shell đi kèm với một số lượng nhỏ các lệnh tích hợp. Hầu hết các nội trang đều thao tác trạng thái shell ( cdthay đổi thư mục hiện tại, setthay đổi tùy chọn và tham số vị trí, exportthay đổi môi trường, chế độ). Hầu hết các shell cung cấp phần lớn các nội dung giống nhau nhưng mỗi shell có một vài phần mở rộng cho tập cơ bản.
  • Các lệnh bên ngoài: chúng độc lập với shell. Giống như các chương trình khác, shell thực thi các chương trình bên ngoài bằng cách tìm kiếm chúng trong đường dẫn tìm kiếm thực thi . Biến PATHmôi trường chứa danh sách các thư mục được phân tách bằng dấu hai chấm để tìm kiếm chương trình.

Trong trường hợp có các lệnh của một số loại có cùng tên, kết quả khớp đầu tiên theo thứ tự trên được thực hiện¹.

Bạn có thể thấy loại lệnh tương ứng với tên bằng cách chạy type some_name.

Bạn có thể liệt kê các bí danh bằng cách chạy tích aliashợp mà không có đối số. Không có cách nào để liệt kê các hàm hoặc nội trang hoạt động trong tất cả các shell. Bạn có thể tìm thấy một danh sách các nội dung trong tài liệu của shell.

Trong bash, hàm setdựng sẵn liệt kê các hàm với định nghĩa cũng như các biến. Trong bash, ksh hoặc zsh, typeset -fliệt kê các hàm với định nghĩa của chúng. Trong bash, bạn có thể liệt kê tất cả các tên lệnh của bất kỳ loại nào với compgen -c. Bạn có thể sử dụng compgen -A alias, compgen -A builtin compgen -A functionđể liệt kê các lệnh của một loại cụ thể. Bạn có thể truyền một chuỗi bổ sung compgenđể chỉ liệt kê các lệnh bắt đầu bằng tiền tố đó.

Trong zsh, bạn có thể liệt kê các lệnh hiện có của một loại nhất định với echo ${(k)aliases}, echo ${(k)functions}, echo ${(k)builtins}echo ${(k)commands}(duy nhất một danh sách cuối cùng các lệnh bên ngoài).

Đoạn mã không rõ ràng sau đây liệt kê tất cả các chương trình bên ngoài có sẵn:

case "$PATH" in
  (*[!:]:) PATH="$PATH:" ;;
esac

set -f; IFS=:
for dir in $PATH; do
  set +f
  [ -z "$dir" ] && dir="."
  for file in "$dir"/*; do
    if [ -x "$file" ] && ! [ -d "$file" ]; then
      printf '%s = %s\n' "${file##*/}" "$file"
    fi
  done
done

Có một trường hợp cạnh trong Bash: các lệnh băm.

Tài liệu tham khảo Bash nói:

Một tìm kiếm đầy đủ các thư mục trong $ PATH chỉ được thực hiện nếu không tìm thấy lệnh trong bảng băm

Thử:

set -h
mkdir ~/dir-for-wat-command
echo 'echo WAT!' >~/dir-for-wat-command/wat
chmod +x ~/dir-for-wat-command/wat
hash -p ~/dir-for-wat-command/wat wat
wat

Biến PATHmôi trường không chứa ~/dir-for-wat-command, compgen -ckhông hiển thị wat, nhưng bạn có thể chạy wat.

Nếu bạn muốn tạo bóng cho một lệnh hiện có, hãy xác định bí danh hoặc hàm .

¹ Ngoại lệ: một vài lệnh nội trú (gọi tắt là lệnh nội trú đặc biệt ) không thể được theo dõi bởi một hàm - bash và zsh không tuân thủ POSIX trên thời điểm đó trong chế độ mặc định của họ mặc dù.


Một trường hợp cạnh khác dành cho các giá trị $PATHlike /bin:/usr/bin:(trailing :), trong đó nó sẽ không liệt kê các tệp thực thi trong thư mục hiện tại.
Stéphane Chazelas

3

Danh sách các lệnh bao gồm hai bộ:

  1. Các lệnh được tích hợp vào trình bao
  2. Các lệnh trong của bạn PATH

Bạn không thể thay đổi các phần dựng sẵn, nhưng bạn có thể ngăn shell sử dụng một phần tử tích hợp bằng cách chỉ định tên đường dẫn đầy đủ như thế nào /bin/echo.

Đối với các lệnh trong của bạn PATH, bạn có thể thay đổi điều đó. PATHlà một danh sách các thư mục được phân tách bằng dấu hai chấm để tìm kiếm các lệnh. Tệp phù hợp đầu tiên được tìm thấy "thắng".

export PATH=~/bin:${PATH}

(Cú pháp này không hoạt động đối với các cshshell được tạo ra, nhưng tất cả các cú pháp khác mà tôi biết).

Đó là xuất khẩu PATHvới ~/binmục đầu tiên tiếp theo là phần còn lại của các PATHmục hiện có . Vì vậy, bây giờ trình bao của bạn sẽ kiểm tra directory calledbin in your home directory for a command *first* before checking the standardPATH` hệ thống được thiết lập. Bạn có thể dễ dàng làm cho nó kiểm tra thư mục mới lần cuối bằng cách sử dụng:

export PATH=${PATH}:~/bin

Để PATHduy trì liên tục cho các lần đăng nhập trong tương lai, hãy thêm nó vào một .profiletệp RC shell khác.


2

Hãy thử điều này, sử dụng :

printf '%s\n' ${PATH//:/\/* }

1

Nếu bạn nhấn phím tab hai lần và sau đó y, bạn sẽ nhận được danh sách tất cả các lệnh có sẵn trong trình bao hiện tại của bạn. Đối với câu hỏi thứ hai tôi nghĩ bạn nên sử dụng bí danh: bí danh shell .


liên quan đến bí danh, đó có phải là cách ghi đè và không ghi đè (bằng cách "không phân biệt") một lệnh khi nó được gọi ở bất kỳ đâu trên hệ thống (ví dụ từ tập lệnh shell)?
themirror

1
Bạn dùng vỏ gì? Tôi không thể lấy tab đôi để liệt kê tất cả các lệnh trên bash của mình.
terdon

Tôi sử dụng bash trên Ubuntu 13.04. Ngoài ra còn có một lệnh gọi là compgen có thể được sử dụng để lấy danh sách tất cả các lệnh có sẵn trên bash.
coffeMug

@terdon Bạn đã cài đặt bash chưa?
coffeMug

1
đặt show-all-if-mơ hồ tắt
coffeMug
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.