Quiero personalizar la funcionalidad del cd
comando según mis necesidades.
Definí la siguiente función:
function cd () { cd "$@" && pushd "$@"; }
La intención de esta función es empujar automáticamente el directorio a la pila para que me ahorre el esfuerzo de escribir manualmente pushd .
cada vez.
Sin embargo, la función anterior es una función infinitamente recursiva, ya que la llamada a cd
se interpreta como la función misma y no como la cd
incorporada.
¿Cómo hago referencia al cd
incorporado en esta función?
Sé que los alias se pueden escapar usando \
. ¿Cuál es la forma de escapar de las funciones o hacer referencia a las funciones incorporadas de una manera más explícita?
Nota: No quiero cambiar el nombre de mi función a otra cosa.
bash
shell-script
shell-builtin
Kshitiz Sharma
fuente
fuente
alias cd=pushd
? ¿Qué esperas que suceda cuando cd a algo que no es un camino absoluto (por ejemplo,cd ../
)?pushd
no es compatible-P
. Pero tiene razón, como se muestra en la pregunta, sefunction cd
ve un poco mal, ya que cambió el directorio dos veces.Respuestas:
El
command
incorporado obliga a que un nombre de comando se interprete como un comando incorporado o externo (omitiendo alias y búsqueda de funciones). Está disponible en todos los shells POSIX, incluido bash.(Tenga en cuenta que este ejemplo es malo: no funciona con rutas relativas, y también podría escribir
pushd
en primer lugar).En bash y zsh (pero no en ksh), puede usar
builtin
para forzar que un nombre de comando se interprete como incorporado, excluyendo alias, funciones y comandos externos.fuente
Bash tiene un comando (incorporado)
builtin
, que hace exactamente lo que necesita. Reemplazarcd
conbuiltin cd
en su función arreglará la recursividad.fuente
Sospecho que cuando dice que "no desea cambiar el nombre de su función a otra cosa", quiere decir que desea poder llamar a su función con el mismo nombre que el comando original.
Entonces, otra forma de hacer esto que también funciona para cosas que no están integradas, es nombrar a su función de otra manera y luego definir un alias para el comando envuelto. Esto funciona porque el alias no existe en el contexto de ejecución de su función.
Ejemplo wrapper.sh:
Y en, por ejemplo, .bash_aliases:
Pero esto es bastante hacky. Usar
command
es preferible cuando sea posible.fuente
Para que esto funcione con rutas relativas, se necesitaría lo siguiente:
Esto supone que está en una distribución Linux lo suficientemente moderna que contiene la utilidad 'realpath'. (RHEL 6 no, por ejemplo). Si Perl está disponible, 'realpath' se puede simular usando:
fuente