Lệnh unix để tìm ra tập tin thực thi nào tương ứng với một lệnh đã cho?


22

Ví dụ, nếu được chuyển lslàm đầu vào, nó sẽ cho tôi biết rằng nó /bin/lssẽ chạy nếu chạy lstrên dòng lệnh.

Câu trả lời:


25

Lệnh sử dụng thay đổi từ shell sang shell.

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 -vcommandtí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, whichwheretương đương với whencevới các tùy chọn -v, -c-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
    

đọc thêm


Lưu ý rằng trong ksh, "type" là bí danh mặc định cho "whence -v" vì vậy có thể được sử dụng giống như với bourne shell và bash truyền thống.
jlliagre

typecũng được xây dựng để zsh?
Hongxu Chen

RHEL6 là RPM (ví dụ, 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.
Dan Pritts

14

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'

3
Hãy cẩn thận: nếu ls là một hàm hoặc được đặt bí danh, bạn muốn 'gõ ls' thay vì 'which ls'
William Pursell

1
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ế.
Peter.O

8

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/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ế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

4

Bạn co thể thử:

whereis ls

Nó đưa cho tôi:

ls: /bin/ls /usr/share/man/man1/ls.1.gz
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.