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 (
cd
thay đổi thư mục hiện tại, set
thay đổi tùy chọn và tham số vị trí, export
thay đổ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
PATH
mô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 alias
hợ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 set
dự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 -f
liệ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}
và 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 PATH
môi trường không chứa ~/dir-for-wat-command
, compgen -c
khô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ù.