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à typelệnh:
$ type '['
[ is a shell builtin
Đối với vỏ Fish,fish The typeBUILTIN 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à whencelệnh - với typeban đầu thành lập như một bí danh phổ thông whence -vvà commandtích hợp với các -vtù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à whencelệnh, với commandbuilt-in với các -vtùy chọn tương đương whencevà được xây dựng-in type, whichvà wheretương đương với whencevới các tùy chọn -v, -cvà -catương ứng.
$ whence ls
/bin/ls
Đối với TC Shell, tcsh, built-in là whichlệ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
typecũ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 whichcho 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 whichcho việc này:
aix@aix:~$ which ls
/bin/ls
Nó hoạt động bằng cách tìm kiếm các PATHtệ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:~$
typetuy nhiên, không hoạt động:
aix@aix:~$ type listdir
listdir is aliased to `/bin/ls'
whichkhô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ế.
whichkhô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/locatefile $(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