¿Cómo establecer un alias por directorio?

18

Supongamos que tiene un alias go, pero quiere que haga cosas diferentes en directorios diferentes.

En un directorio debería ejecutarse cmd1, pero en otro directorio debería ejecutarsecmd2

Por cierto, ya tengo un alias para cambiar a los directorios anteriores, entonces, ¿es posible agregar la goasignación de fooalias al alias?

alias "foo=cd /path/to/foo"

Trabajando en bash (?) En OSX.

B Seven
fuente
1
Para eso están los makefiles.
itsbruce

Respuestas:

16

No está completamente seguro de lo que está preguntando, pero un alias simplemente se expande a lo que está en el alias. Si tiene dos alias, puede agregar los diferentes comandos, incluso alias.

alias "foo=cd /path/to/foo; go"
alias "foo2=cd /path/to/foo2; go"

En cualquier otra situación, puede especificar una función en su .bashrc

function go ()
{
    if [ "$PWD" == "/path/to/foo" ]; then
       cmd1
    elif [ "$PWD" == "/path/to/go" ]; then
       cmd2
    fi;
}

En caso de que tenga más opciones, podría usar mejor una estructura de caso.

Bernhard
fuente
4

Tengo la sensación de que estás muy "orientado al directorio" y, en ese caso, esto podría adaptarse mejor a tu mentalidad.

(Pero para ser honesto, creo que esta es una mala idea por completo, le gustaría que los comandos sean globales).

En .bashrc, poner alias go="./.cmd"(entonces source ~/.bashrc).

Luego, en cada directorio, coloque un script llamado .cmd, luego chmod +x .cmd, simplemente gohaga lo suyo.

Emanuel Berg
fuente
2
Eso es mucho trabajo ... aquí está el caso de uso: al ejecutar pruebas, quiero alias rspec-all para ejecutar ciertas pruebas. Pero qué pruebas depende del proyecto. Y eso está determinado por el directorio.
B Seven
2
Lo que puedo ver es que tiene dos opciones: usar una función (como @Bernhard descrito anteriormente) y ramificar según el directorio (como él dijo), o puede poner los parámetros en los directorios. Ahora que lo pienso, no tiene que ser scripts, simplemente puede poner un archivo ( touch .TESTNO; echo 2 > .TESTNO) en cada directorio y luego, en su función, buscar ese archivo y bifurcar según el número de prueba del archivo .TESTNO contiene. Aunque no es del todo difícil, probablemente no pueda usar un alias para esto; debes usar una función.
Emanuel Berg
2

Estoy trabajando en un proyecto que logra eso. Compruébalo: localalias .

Aquí hay una demostración:

ingrese la descripción de la imagen aquí

Curiosamente, en realidad lo usé gocomo ejemplo en la demostración. No mostré el cambio de directorios (algo que debería cambiar sobre la demostración) pero las funciones con el lacomando son de hecho locales al directorio en el que están definidas.

Bryan Bugyi
fuente
1
function go() {
  if [ ! -e "./.cmd1" ]
    then command go -a $1
    else command go -b $1
  fi
}

Algo similar, pero suponiendo que "ir" es un comando del que desea una funcionalidad diferente en un directorio específico.

segundo planeta
fuente
1

Si agrega la siguiente función a su .bashrc

function cd () { 
  builtin cd "$@" && [[ -f .aliases ]] && . .aliases
  return 0
}

Cada vez que cd a un directorio con un archivo .aliases se obtendrá.

Tenga cuidado con la seguridad si otros pueden crear archivos en su máquina.

Con este truco, los alias nunca se eliminan, pero puede escribir tanto código como desee en la función.

Ondir usa este truco y tiene un montón de campanas y silbatos.

http://swapoff.org/ondir.html#download

teknopaul
fuente
Si bien creo que esto es inteligente, parece que es peligroso ya que depende .bashrc. (Esto no funcionará cron, por ejemplo).
ctbrown
No estoy seguro de que haya algo peligroso en bashrc. Creo que este es el lugar estándar / correcto para los alias. Es en la naturaleza de los entornos que son diferentes. Haga la pregunta, un ambiente diferente es lo que se requiere. No hay nada que le impida buscar un .bashrc de usuarios en cron si desea que cron tenga un entorno similar . Se debe esperar que NB cron se comporte de manera diferente a un shell interactivo debido al uso de isatty y chums.
teknopaul
Es cierto que no hay nada peligroso en bashrc en sí. El problema es que no tiene forma de asegurarse de que el proceso que está cambiando a directorio generará bashrc. Una cosa es si es su sesión interactiva. Es muy diferente si ese directorio se comparte entre usuarios y procesos que pueden o no usar el shell bash. .bash_aliases es la ubicación preferida para los alias bash en algunos sistemas.
ctbrown