Ho bisogno di trovare il percorso di un determinato programma PATH
sull'uso di uno script di shell. Il percorso deve essere il percorso completo effettivo del programma, che può essere passato in seguito a una delle exec*
funzioni, che non ricerca PATH
se stesso, ad es execv
.
Ci sono programmi come kill
, che sono disponibili come un vero programma e una shell integrata allo stesso tempo. In questo caso, ho bisogno del percorso completo per il programma effettivo.
Esistono diverse utilità che possono trovare un programma PATH
come specificato nella Sezione 2.9.1.1, Ricerca comandi ed esecuzione dello standard POSIX .
C'è which
, che non fa parte di nessuno standard. Può essere un programma regolare su alcuni sistemi, mentre alcune shell forniscono che è incorporato. Sembra essere disponibile sulla maggior parte dei sistemi e delle shell, ma le shell con una versione integrata restituiscono semplicemente il nome del file incorporato anziché il percorso dell'eseguibile. Inoltre, non è standardizzato in alcun modo e può restituire qualsiasi output e prendere diverse opzioni.
bash# which kill
/usr/bin/kill
dash# which kill
/usr/bin/kill
fish# which kill
/usr/bin/kill
mksh# which kill
/usr/bin/kill
tcsh# which kill
kill: shell built-in command.
zsh# which kill
kill: shell built-in command
C'è whence
, che è incorporato in alcune shell. Ma non disponibile su molte shell. Restituirà anche il nome del built-in invece del percorso del programma. A -p
può essere passato a dove modificare questo comportamento.
bash# whence kill
bash: whence: command not found
dash# whence kill
dash: 1: whence: not found
fish# whence kill
fish: Unknown command 'whence'
mksh# whence kill
kill
mksh# whence -p kill
/usr/bin/kill
tcsh# whence kill
whence: Command not found.
zsh# whence kill
kill
zsh# whence -p kill
/usr/bin/kill
C'è il command
builtin specificato da POSIX: 2008 . Sfortunatamente cerca anche comandi e built-in regolari e restituirà il nome del built-in invece del percorso del programma ombreggiato da un built-in con lo stesso nome. Alcune vecchie shell non l'hanno ancora implementato.
bash# command -v kill
kill
dash# command -v kill
kill
fish# command -v kill
/usr/bin/kill
mksh# command -v kill
kill
tcsh# command -v kill
command: Command not found.
zsh# command -v kill
kill
realpath
enable
è fornito solo da bash
ezsh
type -p
. Sia bash che dash consentono di pronunciare il command
comando per eseguire un eseguibile effettivo anche se esiste una funzione o un builtin con lo stesso nome.
command
salta le funzioni (e gli alias) ma NON i builtin, come dice correttamente la Q. E non puoi sempre usare uno shebang perché non esiste un percorso che ottenga una determinata shell, o persino una shell POSIX, su tutti i sistemi.
enable
è specificato in POSIX o meno, ma se lo è, è possibile utilizzareenable -n which
per disabilitare la shell integratawhich
.