Shell - Bagaimana menemukan direktori beberapa perintah?

127

Saya tahu bahwa ketika Anda menggunakan shell, satu-satunya perintah yang dapat digunakan adalah perintah yang dapat ditemukan di beberapa direktori yang diatur pada PATH. Bahkan saya tidak tahu bagaimana cara melihat dirs yang ada pada variabel PATH saya (dan ini adalah pertanyaan bagus yang bisa dijawab), yang ingin saya ketahui adalah:

Saya datang ke shell dan menulis:

$ lshw

Saya ingin tahu perintah pada shell yang dapat memberi tahu saya di mana perintah ini berada. Dengan kata lain, di mana "file yang dapat dieksekusi" ini berada?

Sesuatu seperti:

$ location lshw
/usr/bin

Siapa saja?

Gabriel L. Oliveira
sumber

Jawaban:

187

Jika Anda menggunakan Bash atau zsh, gunakan ini:

type -a lshw

Ini akan menunjukkan apakah targetnya adalah builtin, fungsi, alias atau executable eksternal. Jika yang terakhir, itu akan menunjukkan setiap tempat itu muncul di Anda PATH.

bash$ type -a lshw
lshw is /usr/bin/lshw
bash$ type -a ls
ls is aliased to `ls --color=auto'
ls is /bin/ls
bash$ zsh
zsh% type -a which
which is a shell builtin
which is /usr/bin/which

Di Bash, untuk fungsi type -ajuga akan menampilkan definisi fungsi. Anda dapat menggunakannya declare -f functionnameuntuk melakukan hal yang sama (Anda harus menggunakannya untuk zsh, karena type -atidak).

Dijeda sampai pemberitahuan lebih lanjut.
sumber
Terima kasih kepada semua orang yang menjawab, tetapi jawaban ini adalah yang paling menarik! Terima kasih! Saya berpikir bahwa saya gila, karena saya mendefinisikan (sudah lama) cara untuk melakukan ini: 'pembaruan', dan ini telah melakukan 'pembaruan apt-get; apt-get dist-upgrade 'untuk saya. Tetapi untuk sekarang, saya mencoba menemukan beberapa file update.sh di suatu tempat, dan saya tidak dapat menemukannya. Itu sebabnya saya memulai pertanyaan ini. Tapi sekarang, menggunakan 'type -a update' saya menemukan bahwa ini hanya alias yang didefinisikan pada .bashrc saya yang terletak di ~ rumah saya. Terima kasih sekali.
Gabriel L. Oliveira
1
@ Gabriel: Jika Anda tidak terbiasa dengan locatehal itu dapat membantu menemukan file. Ini menggunakan database yang dikelola oleh updatedbyang dijalankan dari pekerjaan cron. Karena locatemencari database daripada keseluruhan sistem file, ini jauh lebih cepat daripada find(yang bisa digunakan sebagai pilihan terakhir).
Dijeda sampai pemberitahuan lebih lanjut.
Terima kasih. Saya akan mempelajari alat ini, dan melihat bagaimana updatedb dijadwalkan berjalan di cronjob Ubuntu.
Gabriel L. Oliveira
Terkadang type -abisa membingungkan. misalnya dalam kasus nvmyang merupakan fungsi bash yang perlu saya lakukan: type -a nvm | head -n1untuk mencari tahu apa sebenarnya nvm.
Marinos An
@MarinosAn: Untuk fungsi, type -amenampilkan definisi fungsi serta jenis yang dapat dieksekusi. Risiko menggunakan headadalah bahwa dalam kasus nama dengan lebih dari satu jenis, tipe tambahan tidak akan menjadi output. Anda mungkin ingin melihatnya type -t.
Dijeda sampai pemberitahuan lebih lanjut.
64

Seperti ini:

which lshw

Untuk melihat semua perintah yang cocok di jalur Anda:

which -a lshw 
Ignacio Vazquez-Abrams
sumber
7
juga yang-lshw untuk melihat semua perintah yang cocok di jalur Anda.
AlG
Saya percaya ini hanya berfungsi dengan perintah (executable pada $ PATH), bukan fungsi.
Olivier Lacan
whichbermasalah karena ada beberapa implementasi, banyak di antaranya melakukan hal yang salah sepenuhnya, dan yang lain tampaknya berfungsi dengan baik, tetapi memiliki kejutan aneh. Anda sebaiknya memilih type.
tripleee
Tidak berfungsi untuk fungsi alias dan bash. Setidaknya di ubuntu. Penggunaan yang lebih baiktype -a lshw
Marinos
17

PATH adalah variabel lingkungan, dan dapat ditampilkan dengan perintah gema:

echo $PATH

Ini adalah daftar jalur yang dipisahkan oleh karakter titik dua ' :'

The whichperintah memberitahu Anda file yang yang dijalankan ketika Anda menjalankan perintah:

which lshw

terkadang yang Anda dapatkan adalah jalur menuju symlink; jika Anda ingin melacak tautan itu ke tempat eksekusi aktual, Anda dapat menggunakan readlinkdan memberi output kepada which:

readlink -f $(which lshw)

The -fparameter menginstruksikan readlinkuntuk terus mengikuti symlink rekursif.

Ini contoh dari mesin saya:

$ which firefox
/usr/bin/firefox

$ readlink -f $(which firefox)
/usr/lib/firefox-3.6.3/firefox.sh
Hasen
sumber
5
~$ echo $PATH
/home/jack/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
~$ whereis lshw
lshw: /usr/bin/lshw /usr/share/man/man1/lshw.1.gz
Mendongkrak
sumber
3

Dalam TENEX C Shell, tcsh , seseorang dapat membuat daftar lokasi perintah, atau jika itu adalah perintah bawaan, menggunakan whereperintah misalnya:

tcsh% where python
/usr/local/bin/python
/usr/bin/python

tcsh% where cd
cd is a shell built-in
/usr/bin/cd
Pierz
sumber
0

Shell Korn ksh,, menawarkan whencebuilt-in, yang mengidentifikasi shell built-in, makro, dll. Namun, whichperintah ini lebih portabel.

mpez0
sumber
1
Dalam ksh, whence -amirip dengan Bash type -a.
Dijeda sampai pemberitahuan lebih lanjut.
0

Alternatif untuk type -aadalahcommand -V

Karena sebagian besar kali saya tertarik pada hasil pertama saja, saya juga menyalurkan dari kepala. Dengan cara ini layar tidak akan membanjiri kode jika ada fungsi bash.

command -V lshw | head -n1
Marinos An
sumber