2012-04-05 9 views
5


Generalmente mantengo la configuración específica del directorio en .bashrc y cada vez que cambio el directorio ejecuto el comando source .bashrc para hacer esas configuraciones efectivas.
Ahora estaba pensando en manipular comandos de cd en ~/.bashrc, por lo que cada vez que coporo un directorio nuevo y si existe .bashrc allí, se cargará automáticamente.personalizando el comando de cd

Similar a este cd $1; source .bashrc (he verificado que $ 1 es una ruta válida), pero el problema es cd es shell builting, por lo que es un bucle recursivo (cd siempre apunta a modificar cd). No tenemos el archivo elf de cd (que generalmente tenemos de otros comandos como scp u otros). Entonces, ¿cómo puedo lograr esto? También si es compatible con shopt -s cdspell, entonces también necesito tener una ruta de acceso de escritura en argumento de $ 1.

+0

¿Por qué la gente la está cerrando? ¿Es este duplicado para otro hilo, no lo creo? ¿O debido a que las personas tienen una reputación de 100K o 900K no podrían tener la oportunidad de responderlo? – peeyush

Respuesta

6

Quiere el comando "incorporado";

incorporadas [argumentos] concha incorporado

ejecutar la orden interna del shell especificado, pasándolo argumentos, y vuelven a su estado de salida. Esto es útil cuando define una función cuyo nombre es el mismo que un shell builtin, conservando la funcionalidad de la función incorporada dentro de la función. El cd incorporado comúnmente se redefine de esta manera. El estado de retorno es falso si shell-builtin no es un comando integrado de shell.

Desde: http://linux.die.net/man/1/bash

Por lo tanto, usted podría tener algo como (no probado, no tienen una fiesta de la mano tampoco);

function cd() { 
    builtin cd $1 \ 
     && test -e .bashrc \ 
     && source .bashrc 
} 
+0

:-) fresco. (¿Por qué hay 15 caracteres de límite?) – peeyush

+1

Necesita 'prueba' antes de' -e'. – l0b0

+0

Gracias, lo arreglaron. –

0

Usted podría intentar esto:

function cdd(){ cd $1; if [ -e ./.bashrc ] ; then source ./.bashrc; fi; } 
alias cd = 'cdd' 
? 

¿No probado esto mucho, sin embargo.

+0

problema es la misma llamada recursiva a esta nueva definición de cd. – peeyush

+0

He probado esto en la siguiente variante: function cdd() { cd $ 1; if [-e ./.bashrc]; luego echo "Hola, ahi"; fi } alias cd = 'CDD' Entonces prompt> cd Hola, hay – begemotv2718

1

RVM hace esto:

$ type cd 
cd is a function 
cd() 
{ 
    if builtin cd "[email protected]"; then 
     [[ -n "${rvm_current_rvmrc:-}" && "$*" == "." ]] && rvm_current_rvmrc="" || true; 
     __rvm_do_with_env_before; 
     __rvm_project_rvmrc; 
     __rvm_after_cd; 
     __rvm_do_with_env_after; 
     return 0; 
    else 
     return $?; 
    fi 
} 

Y sí, esto funciona en mi máquina. Esencialmente, como dijo @RoryHunter, use builtin y ejecute algún código si tiene éxito, o devuelva el código de salida si falla.

2

Puede echa un vistazo a direnv. https://github.com/zimbatm/direnv

+0

Uno de los objetivos específicos cuando diseñé Direnv fue evitar reemplazar comandos incorporados como lo hace RVM (¿verdad?). En su lugar, depende directamente de los enlaces shell como PROMPT_COMMAND en bash para detectar cambios en el directorio. – zimbatm

Cuestiones relacionadas