Me encontré con un comando de Linux, builtin cd
.
¿Cuál es la diferencia entre los comandos builtin cd
y cd
?
De hecho, hice algunas investigaciones sobre la diferencia, pero no pude encontrar una explicación notable y significativa sobre esto.
Me encontré con un comando de Linux, builtin cd
.
¿Cuál es la diferencia entre los comandos builtin cd
y cd
?
De hecho, hice algunas investigaciones sobre la diferencia, pero no pude encontrar una explicación notable y significativa sobre esto.
Respuestas:
El cd
comando está integrado, por lo que normalmente builtin cd
hará lo mismo que cd
. Pero hay una diferencia si cd
se redefine como una función o un alias, en cuyo caso cd
llamará a la función / alias pero builtin cd
aún cambiará el directorio (en otras palabras, mantendrá el acceso incorporado incluso si está bloqueado por una función).
Por ejemplo:
user:~$ cd () { echo "I won't let you change directories"; }
user:~$ cd mysubdir
I won't let you change directories
user:~$ builtin cd mysubdir
user:~/mysubdir$ unset -f cd # undefine function
O con un alias:
user:~$ alias cd='echo Trying to cd to'
user:~$ cd mysubdir
Trying to cd to mysubdir
user:~$ builtin cd mysubdir
user:~/mysubdir$ unalias cd # undefine alias
El uso builtin
también es una buena manera de definir una cd
función que hace algo y cambia el directorio (ya que llamar cd
desde él simplemente seguiría llamando a la función nuevamente en una recursión sin fin).
Por ejemplo:
user:~ $ cd () { echo "Changing directory to ${1-home}"; builtin cd "$@"; }
user:~ $ cd mysubdir
Changing directory to mysubdir
user:~/mysubdir $ cd
Changing directory to home
user:~ $ unset -f cd # undefine function
builtin cd mysubdir
y \cd mysubdir
?
cd
, en cuyo caso \cd
omitiría el alias y ejecutaría la función. Ver stackoverflow.com/a/16506263/4518341
En la mayoría de los casos, no hay diferencia (pero ver más abajo). El cd
comando es un comando incorporado en todos los shells. Debe estar integrado en 1 ya que un comando externo no puede cambiar el entorno del shell de invocación, y cambiar el directorio de trabajo constituye un cambio en su entorno.
El bash
comando builtin
obliga al shell a utilizar la versión integrada de un comando, aunque puede haber una función de shell, un alias o un comando externo disponible con el mismo nombre.
En el caso donde no está por ejemplo una función de shell con el nombre cd
, entonces builtin cd
sería no llamar a ese. El uso builtin cd
evita cualquier funcionalidad sobrecargada que el usuario haya agregado mediante una función de shell o un alias.
Ejemplo:
El cd
comando incorporado puede estar sobrecargado por una función que actualiza la solicitud:
cd() {
builtin cd "$@" && PS1=$(__update_prompt)
}
donde __update_prompt
hay alguna otra función proporcionada por el usuario que genera una cadena.
El builtin cd
en la función no llamaría a la función recursivamente. El uso builtin cd
en un shell donde esta función está activa, adicionalmente, no llamaría a la función.
1 Hay Unices con un cd
comando externo (macOS y, creo, Solaris). El propósito de ese comando, que no puede cambiar el directorio de trabajo de un shell, es posiblemente satisfacer el estándar POSIX, que se enumera cd
como una de las utilidades externas que deberían estar disponibles ( cd
no es una de las "utilidades incorporadas especiales") . También puede servir como prueba para ver si sería posible cambiar el directorio de trabajo a un directorio dado .
cd
comando externo .