Puede usar el command
shell incorporado para omitir el proceso de búsqueda normal y ejecutar el comando dado como un comando externo independientemente de cualquier otra posibilidad (shell incorporado, alias, etc.). Esto a menudo se realiza en scripts que deben ser portables en todos los sistemas, aunque probablemente más comúnmente usando la abreviatura \
(como en \rm
lugar de command rm
o rm
, ya que especialmente este último puede tener un alias a algo que no se conoce rm -i
).
$ time
real 0m0.000s
user 0m0.000s
sys 0m0.000s
$ command time
Usage: time [-apvV] [-f format] [-o file] [--append] [--verbose]
[--portability] [--format=format] [--output=file] [--version]
[--quiet] [--help] command [arg...]
$
Esto se puede usar con un alias, así:
$ alias time='command time'
$ time
Usage: time [-apvV] [-f format] [-o file] [--append] [--verbose]
[--portability] [--format=format] [--output=file] [--version]
[--quiet] [--help] command [arg...]
$
La ventaja de esto sobre, por ejemplo, alias time=/usr/bin/time
es que no está especificando la ruta completa al time
binario, sino que recurre al mecanismo de búsqueda de ruta habitual.
El alias
comando en sí mismo puede entrar, por ejemplo, ~ / .bashrc o /etc/bash.bashrc (este último es global para todos los usuarios del sistema).
Para el caso opuesto (forzar el uso del shell incorporado en caso de que haya un alias definido), usaría algo como builtin time
, que de nuevo anula el proceso de búsqueda habitual y ejecuta el shell incorporado nombrado. La página de manual de bash menciona que esto a menudo se usa para proporcionar una cd
funcionalidad personalizada con una función llamada cd
, que a su vez usa el incorporado cd
para hacer lo real.
type -a <cmd>
.command
no puentea los componentes incorporados (exceptozsh
cuando no emula otras capas). Omite funciones y esa es la razón principal de su existencia. Su segundo papel es eliminar el especial en construcciones especiales . Omite los alias y las palabras clave solo porque solo se expanden en la primera posición (zsh
por ejemplo, no omite los alias globales). No haytime
bash incorporado.time
es una palabra clave para que pueda hacer por ejemplotime { foo; bar; }
.command
funciona en este caso particular, como se ejemplifica, pero obviamente una respuesta correcta es mejor que la mitad correcta.builtin time
no funciona'time' echo test
Hay un acceso directo en bash para eludir las palabras clave, sin tener que especificar una ruta o usar otro incorporado como
command
: Escápelo con una barra invertida.Personalmente, me parece más legible y seguro, ya que esto es posible:
fuente
time
hará:ti\me
,'time'
,ti""me
,ti${-##*}me
,${-+time}
... Esto se aplica a cualquier palabra clave cáscara.(x_x)
Las soluciones generales para los elementos integrados (por ejemplo, prueba) son [1] :
uso
env
(todos los depósitos)deshabilitar el incorporado (solo bash y zsh):
use cualquier barra inclinada
/
para llamar al comando (todos los shells):hacer un alias (falla dentro de un script bash, excepto si
shopt -s expand_aliases
se usa):Pero el tiempo no es un tiempo incorporado.
La palabra
time
es una "Palabra reservada", no un comando y tampoco una función incorporada. Eso permite estas soluciones:Cita la palabra. Esto no funciona con elementos integrados.
Muchas formas de trabajo de citas:
\time
"time"
'time'
ti\me
ti"me"
etc.Esto es útil para omitir un alias. Incluso si
test
tiene un alias,\test
ejecutará el comando PATHed (o el incorporado si no se ha deshabilitado).Use el incorporado
command
(esto no funciona con las funciones integradas):Como se indicó anteriormente para las
/
funciones integradas, el uso de cualquier barra oblicua funciona:Como anteriormente para las incorporadas, un alias también funciona aquí:
[1] Supongamos que hay un ejecutable externo
~/bin/test
que imprime "prueba externa". Y además: supongamos que~/bin
está por delante/bin
en la RUTA activa.fuente
Deja esto en tu
~/.bashrc
:alias time=/usr/bin/time
fuente
Puede usar el
enable
comando para deshabilitar ciertos elementos integrados.Sin embargo,
time
es una palabra clave, por lo que no funcionará.Entonces te queda crear un alias para anularlo:
fuente