Câu trả lời:
Chỉ một shell được tích hợp sẵn sẽ cho biết chính xác shell sẽ làm gì cho một tên lệnh đã cho, vì chỉ các shell được xây dựng mới có thể biết đầy đủ về bí danh, các hàm shell, các hàm dựng sẵn khác, v.v. Ghi nhớ: Không phải tất cả các lệnh tương ứng với các tệp thực thi ở vị trí đầu tiên.
Đối với shell Bourne Again bash
, tích hợp là type
lệnh:
$ type '['
[ is a shell builtin
Đối với vỏ Fish,fish
The type
BUILTIN hoạt động tương tự để bash. Để chỉ đường dẫn đến một tệp thực thi, hãy sử dụng command -v
:
$ type cat
cat is /bin/cat
$ command -v cat
/bin/cat
Đối với Korn Shell, ksh
, built-in là whence
lệnh - với type
ban đầu thành lập như một bí danh phổ thông whence -v
và command
tích hợp với các -v
tùy chọn tương đương với whence
:
$ whence -v ls
ls is a tracked alias for /bin/ls
Đối với Shell Z, zsh
, built-in là whence
lệnh, với command
built-in với các -v
tùy chọn tương đương whence
và được xây dựng-in type
, which
và where
tương đương với whence
với các tùy chọn -v
, -c
và -ca
tương ứng.
$ whence ls
/bin/ls
Đối với TC Shell, tcsh
, built-in là which
lệnh - không nên nhầm lẫn với bất kỳ lệnh bên ngoài bằng cái tên đó:
> which ls
ls: aliased to ls-F
> which \ls
/bin/ls
type
cũng được xây dựng để zsh?
which-2.19-6.el6.x86_64
) đặt tệp khởi động vào /etc/profile.d/which2.sh
. Điều này được đọc bởi các vỏ không phải csh, bao gồm cả zsh. Nó bí danh which
cho chính nó. Vì vậy, đối với người dùng zsh nói riêng, nó ghi đè phá vỡ nội trang which
.
Bạn có thể sử dụng which
cho việc này:
aix@aix:~$ which ls
/bin/ls
Nó hoạt động bằng cách tìm kiếm các PATH
tệp thực thi khớp với tên của các đối số. Lưu ý rằng không hoạt động với bí danh shell:
aix@aix:~$ alias listdir=/bin/ls
aix@aix:~$ listdir /
bin dev initrd.img lib32 media proc selinux tmp vmlinuz
...
aix@aix:~$ which listdir
aix@aix:~$
type
tuy nhiên, không hoạt động:
aix@aix:~$ type listdir
listdir is aliased to `/bin/ls'
which
không nhất thiết là đủ Nó chỉ trả về tên được tìm thấy đầu tiên trong $ PATH ... Tên đó có thể là một liên kết tượng trưng và không phải là thực thi cuối chuỗi thực tế.
which
không không (nhất thiết) trả lại tập tin thực thi. Nó trả về tên tệp phù hợp đầu tiên mà nó tìm thấy trong $ PATH (hoặc nhiều tệp giống như được đặt tên khi sử dụng which -a
) ... Việc thực thi thực tế có thể cách xa nhiều liên kết.
which locate
/usr/bin/locate
file $(which locate)
/usr/bin/locate: symbolic link to /etc/alternatives/locate'
Lệnh tìm thấy thực thi thực tế là readlink -e
,
(kết hợp với which
)
readlink -e $(which locate)
/usr/bin/mlocate
Để xem tất cả các liên kết trung gian :
f="$(which locate)" # find name in $PATH
printf "# %s\n" "$f"
while f="$(readlink "$f")" ;do # follow links to executable
printf "# %s\n" "$f"
done
# /usr/bin/locate
# /etc/alternatives/locate
# /usr/bin/mlocate
Bạn co thể thử:
whereis ls
Nó đưa cho tôi:
ls: /bin/ls /usr/share/man/man1/ls.1.gz