Apa perintah unix untuk mencari tahu file executable apa yang sesuai dengan perintah yang diberikan?

22

Sebagai contoh, jika dilewatkan lssebagai input, ia harus memberitahu saya bahwa /bin/lsakan berjalan jika dijalankan lspada command-line.

hugomg
sumber

Jawaban:

25

Perintah untuk menggunakan bervariasi dari shell ke shell.

Hanya built-in shell yang akan memberi tahu yang benar apa yang shell akan lakukan untuk nama perintah yang diberikan, karena hanya built-in yang dapat sepenuhnya tahu tentang alias, fungsi shell, built-in lainnya, dan sebagainya. Ingat: Tidak semua perintah terkait dengan file yang dapat dieksekusi di tempat pertama.

  • Untuk shell Bourne Again bash, built-in adalah typeperintah:

    $ type '['
    [ is a shell builtin
    
  • Untuk cangkang Ikanfish ,, typebuiltin bekerja mirip dengan bash. Untuk mendapatkan path ke executable, gunakan command -v:

    $ type cat
    cat is /bin/cat
    $ command -v cat
    /bin/cat
    
  • Untuk Korn Shell, ksh, built-in adalah whenceperintah - dengan typeawalnya dibentuk sebagai alias biasa untuk whence -vdan commandbuilt-in dengan -vopsi setara dengan whence:

    $ whence -v ls
    ls is a tracked alias for /bin/ls
    
  • Untuk Z Shell, zsh, built-in adalah whenceperintah, dengan commandbuilt-in dengan -vopsi setara dengan whencedan built-in type, whichdan wheresetara dengan whencedengan pilihan -v, -cdan -camasing-masing.

    $ whence ls
    /bin/ls
    
  • Untuk TC Shell, tcsh, built-in adalah whichperintah - tidak harus bingung dengan perintah eksternal dengan nama itu:

    > which ls
    ls: aliased to ls-F
    > which \ls
    /bin/ls
    

Bacaan lebih lanjut

JdeBP
sumber
Perhatikan bahwa di bawah ksh, "type" adalah alias default untuk "whence -v" sehingga dapat digunakan sama seperti shell bourne tradisional dan bash.
jlliagre
typejuga dibangun untuk zsh?
Hongxu Chen
RHEL6 yang RPM (misalnya, which-2.19-6.el6.x86_64) menempatkan file startup /etc/profile.d/which2.sh. Ini dibaca oleh cangkang non-csh, termasuk zsh. Itu alias whichuntuk dirinya sendiri. Jadi untuk pengguna zsh pada khususnya itu menimpa istirahat builtin which.
Dan Pritts
14

Anda dapat menggunakan whichini:

aix@aix:~$ which ls
/bin/ls

Ini bekerja dengan mencari PATHfile yang dapat dieksekusi yang cocok dengan nama-nama argumen. Perhatikan bahwa ini tidak bekerja dengan alias alias:

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:~$

typeNamun, berhasil:

aix@aix:~$ type listdir
listdir is aliased to `/bin/ls'
NPE
sumber
3
Hati-hati: jika ls adalah fungsi atau alias, Anda ingin 'mengetik ls' daripada 'yang ls'
William Pursell
1
whichbelum tentu cukup sendiri. Hanya mengembalikan pertama berhasil ditemukan nama di $ PATH ... Itu nama mungkin symbolic link, dan tidak aktual akhir-of-rantai dieksekusi.
Peter.O
8

whichtidak tidak (harus) mengembalikan file eksekusi. Ini mengembalikan nama file yang cocok pertama yang ditemukan di $ PATH (atau beberapa file seperti bernama saat menggunakan which -a) ... executable yang sebenarnya mungkin beberapa link jauhnya.

  • which locate
    /usr/bin/locate
    `
  • file $(which locate)
    /usr/bin/locate: symbolic link to /etc/alternatives/locate'

Perintah yang menemukan executable aktual adalah readlink -e,
(dalam hubungannya dengan which)

  • readlink -e $(which locate)
    /usr/bin/mlocate

Untuk melihat semua tautan perantara :

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
Peter.O
sumber
4

Anda dapat mencoba:

whereis ls

Ini memberi saya:

ls: /bin/ls /usr/share/man/man1/ls.1.gz
Ivan Morgillo
sumber