Estoy tratando de escribir todos mis sh
scripts de inicio / env para trabajar con DRY y tanto: "funciona en cada * nix en el que lo clono", como sea posible. Esto significa asegurarse de que si trato de ejecutar el código que no está allí, el código falla correctamente. Para ello necesito poder probar si existen programas. Sé cómo probar si existe un archivo, pero no estoy seguro de cómo hacerlo para ver si una aplicación es ejecutable dentro de la ruta. Prefiero usar $ PATH, ya que algunos de estos necesitan trabajar en arch, ubuntu y centos. Algunos pueden instalarse en mi homedir, en sistemas donde no tengo root, otros pueden no instalarse y otros aún pueden instalarse en las rutas del sistema.
shell
shell-script
posix
xenoterracida
fuente
fuente
Respuestas:
Uso
type commandname
. Esto devuelve verdadero sicommandname
hay algo ejecutable: alias, función, comando incorporado o externo (buscado en$PATH
). Alternativamente, usecommand commandname
which return true sicommandname
es un comando incorporado o externo (buscado en$PATH
).Hay algunas variantes sh (definitivamente pre-POSIX; conozco
/bin/sh
bajo OSF1 ≤3.xy algunas versiones del shell Almquist que se encuentran en las primeras versiones de NetBSD y algunas distribuciones Linux del siglo XX) dondetype
siempre devuelve 0 o no existe. No creo que haya ningún sistema enviado con estos este milenio. Si alguna vez los encuentra, aquí hay una función que puede usar para buscar$PATH
manualmente:Esta función es generalmente útil si desea excluir funciones y funciones incorporadas y buscar el nombre
$PATH
. La mayoría de los shells tienen una función incorporada para esto,command -v
aunque es una adición relativamente reciente a POSIX (todavía opcional a partir de POSIX: 2004). Básicamente es una versión amigable para el programadortype
: imprime la ruta completa para un ejecutable$PATH
, el nombre para una función o función incorporada y una definición de alias para un alias.Ksh, bash y zsh también tienen
type -p
que buscar solo ejecutables en$PATH
. Tenga en cuenta que en bash, el estado de retorno detype -p foo
es 0 sifoo
es una función o incorporada; si desea probar un archivo ejecutable$PATH
, debe verificar que la salida no esté vacía.type -p
no está en POSIX; por ejemplo, la ceniza de Debian (que está/bin/sh
en Ubuntu) no la tiene.fuente
if [ type keychain ]; then
no funcionará? Me sale error/home/xenoterracide/.zshrc:84: parse error: condition expected: type
supongo que podría escribir la función existe ... Sólo pensé que esto podría ser más simple en un sentido ...if type $APP >/dev/null 2>/dev/null; then ...
No quieres el[]
.type -p
si está buscando específicamente un comando en$PATH
(no alias o funciones o incorporados).Si solo está buscando programas externos, también puede usar cuáles. Sin embargo, no sé cuán portátil es eso.
fuente
type
ocommand
;which
no está en POSIX, por ejemplo. En la práctica,which
existe en casi todas partes, pero en algunos lugares (donde se implementa como un script csh) utiliza una ruta diferente (debido a a.cshrc
), lo que anula el propósito.