que programacion instruccion instalar ejecutar directorio comando bash function cd

programacion - que es un comando bash



Ejecuta una función bash al ingresar a un directorio (4)

Hay algunas otras versiones de esto por ahí, incluyendo

  • smartcd , que escribí, y tiene un montón de características que incluyen plantillas y ahorro temporal de variables
  • ondir , que es más pequeño y mucho más sencillo.

Ambos soportan tanto bash como zsh

Me gustaría ejecutar una función de bash particular cuando ingrese a un nuevo directorio. Algo como:

alias cd="cd $@ && myfunction"

$@ no funciona allí, y agregar una barra invertida no ayuda. También estoy un poco preocupado por jugar con cd, y sería bueno si esto funcionara para otros comandos que cambiaron el directorio, como pushd y popd .

¿Alias ​​/ comandos mejores?


He escrito un script ZSH que utiliza la función de devolución de llamada chpwd para las 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á ingresando el cd''ing, revisará los directorios principales hasta que encuentre un script en la fuente (o hasta que llegue a / ). También llama a una función unmagic cuando cd''ing fuera del directorio, lo que le permite limpiar su entorno cuando deja un proyecto.

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

Ejemplo para un script "mágico":

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 }


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

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

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


Los alias no aceptan parámetros. Deberías usar una función. No hay necesidad de ejecutarlo automáticamente cada vez que se emita un aviso.

function cd () { builtin cd "$@" && myfunction; }

La palabra clave builtin permite redefinir un componente Bash sin crear una recursión. La cotización del parámetro lo hace funcionar en caso de que haya espacios en los nombres de directorio.

Los documentos de Bash dicen:

Para casi todos los propósitos, las funciones de shell se prefieren a los alias.