2010-07-29 13 views
16

Me gustaría ejecutar una función bash en particular cuando ingreso un nuevo directorio. Somethink gustan:Ejecutar una función bash al ingresar a un directorio

alias cd="cd [email protected] && myfunction" 

[email protected] no trabaja allí, y la adición de una barra invertida no ayuda. También estoy un poco preocupado por jugar con el CD, y sería bueno si esto funcionó para otros comandos que cambiaron el directorio, como pushd y popd.

¿Algún alias/comando mejor?

Respuesta

17

La solución más fácil que se me ocurre es con este

myfunction() { 
    if [ "$PWD" != "$MYOLDPWD" ]; then 
    MYOLDPWD="$PWD"; 
    # strut yer stuff here.. 
    fi 
} 

export PROMPT_COMMAND=myfunction 

que debería hacerlo. Funcionará con todos los comandos y se activará antes de que se muestre el mensaje.

+1

Solo agregue 'printf" \ e] 1; $ PWD \ a "' y bam (!), El nombre de la pestaña se cambia a pwd. – Fadi

+0

@Fadi mientras que es cierto, la mayoría de las personas simplemente agrega una secuencia de escape al prompt para eso, realmente no importa que se actualice con cada aviso (en lugar de solo cuando se cambian directorios), ya que no será notorio. – falstro

2

He escrito un script ZSH que utiliza la función de devolución de llamada chpwd para obtener configuraciones ZSH específicas del proyecto de origen. No estoy seguro de si funciona con Bash, pero creo que valdrá la pena intentarlo. Si no encuentra un archivo de script en el directorio en el que está editando, verificará los directorios principales hasta que encuentre un script en la fuente (o hasta que llegue al /). También llama a una función unmagic cuando sale del directorio, lo que le permite limpiar su entorno cuando abandona un proyecto.

http://github.com/jkramer/home/blob/master/.zsh/func/magic

Ejemplo de un guión "mágica":

export BASE=$PWD # needed for another script of mine that allows you to cd into the projects base directory by pressing ^b 

ctags -R --languages=Perl $PWD # update ctags file when entering the project directory 

export PERL5LIB="$BASE/lib" 

# function that starts the catalyst server 
function srv { 
    perl $BASE/script/${PROJECT_NAME}_server.pl 
} 

# clean up 
function unmagic { 
    unfunction src 
    unset PERL5LIB 
} 
+0

No parece ser uno. –

16

Alias ​​no aceptan parámetros. Deberías usar una función. No es necesario ejecutarlo automáticamente cada vez que se emita un mensaje.

function cd() { builtin cd "[email protected]" && myfunction; } 

La palabra clave builtin le permite redefinir un golpe builtin sin crear una recursión. Citar el parámetro lo hace funcionar en caso de que haya espacios en los nombres de los directorios.

El Bash docs dicen:

Para casi cada propósito, funciones de shell se prefieren sobre los alias.

+0

no cubre su preocupación sobre pushd, popd, etc; y hacer una función para cada caso lo hace tal vez más complejo que un comando de solicitud. – falstro

6

Hay algunas otras versiones de este por ahí, incluyendo

  • smartcd, que escribí, y tiene un montón de características que incluyen plantillas y variable temporal ahorro de
  • ondir, que es más pequeña y mucho más simple

ambos soportan tanto bash y zsh

+0

¡Oh, hombre, ese smartcd se ve delicioso! – mihai

Cuestiones relacionadas