Come impostare un alias in base alla directory?


18

Supponiamo di avere un alias go, ma vuoi che faccia cose diverse in directory diverse?

In una directory dovrebbe essere eseguito cmd1, ma in un'altra directory dovrebbe essere eseguitocmd2

A proposito, ho già un alias per passare alle suddette directory, quindi è possibile aggiungere l' goassegnazione dell'alias fooall'alias?

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

Funziona in bash (?) Su OSX.


1
Ecco a cosa servono i makefile.
itsbruce,

Risposte:


16

Non è del tutto sicuro di ciò che stai chiedendo, ma un alias si espande semplicemente in ciò che è nell'alias. Se hai due alias, puoi aggiungere i diversi comandi, anche gli alias.

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

In qualsiasi altra situazione, è possibile specificare una funzione nel proprio .bashrc

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

Nel caso abbiate più possibilità di scelta, potreste usare meglio una struttura di casi.


4

Ho la sensazione che tu sia molto "orientato alle directory" e, in tal caso, ciò potrebbe migliorare la tua mentalità.

(Ma ad essere sincero, penso che questa sia una cattiva idea, vorresti che i comandi fossero globali.)

In .bashrc, inserisci alias go="./.cmd"(quindi source ~/.bashrc).

Quindi, in ciascuna di queste directory, inserisci uno script chiamato .cmd, quindi fai chmod +x .cmdsemplicemente gole tue cose.


2
È un sacco di lavoro ... ecco il caso d'uso: quando eseguo i test, voglio alias rspec-all per eseguire determinati test. Ma quali test dipendono dal progetto. E questo è determinato dalla directory.
B Sette,

2
Quello che posso vedere, hai due opzioni, o usa una funzione (come @Bernhard descritto sopra), e ramifica a seconda della directory (proprio come ha detto), oppure puoi inserire i parametri nelle directory. Pensaci, non devono essere script, potresti semplicemente inserire un file ( touch .TESTNO; echo 2 > .TESTNO) in ogni directory, quindi, nella tua funzione, cercare quel file e diramare in base al numero di test del file .TESTNO contiene. Sebbene non sia affatto difficile, probabilmente non puoi usare un alias per questo; devi usare una funzione.
Emanuel Berg,

2

Sto lavorando a un progetto che realizza proprio questo. Dai un'occhiata: localalias .

Ecco una demo:

inserisci qui la descrizione dell'immagine

Abbastanza divertente, in realtà ho usato gocome esempio nella demo. Non ho mostrato la commutazione delle directory (qualcosa che dovrei cambiare riguardo alla demo) ma le funzioni con il lacomando sono effettivamente locali nella directory in cui sono definite.


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

Simile, ma supponendo che "go" sia un comando da cui si desidera una funzionalità diversa in una directory specifica.


1

Se aggiungi la seguente funzione al tuo .bashrc

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

Ogni volta che esegui il cd in una directory con un file .aliases, questo verrà fornito.

Attento alla sicurezza se altri possono creare file sul tuo computer.

Con questo trucco gli alias non vengono mai rimossi ma puoi scrivere tutto il codice che vuoi nella funzione.

ondir usa questo trucco e ha un sacco di campane e fischietti.

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


Mentre penso che sia intelligente, sembra che sia pericoloso poiché si basa su .bashrc. (Questo non funzionerà cron, per esempio).
ctbrown,

Non sono sicuro che ci sia qualcosa di pericoloso in Bashrc. Credo che questo sia il posto standard / corretto per gli alias. È nella natura degli ambienti che sono diversi. Dare la domanda, un ambiente diverso è ciò che è richiesto. Nulla può impedirti di reperire gli utenti .bashrc in cron se vuoi che cron abbia un ambiente simile . NB cron dovrebbe sempre prevedere un comportamento diverso rispetto a una shell interattiva a causa dell'uso di isatty e chums.
Teknopaul,

È vero, non c'è nulla di pericoloso nello stesso bashrc. Il problema è che non hai modo di assicurarti che il processo che sta cambiando in directory provenga da bashrc. Una cosa è se è la tua sessione interattiva. È un'altra cosa se quella directory è condivisa tra utenti e processi che possono o meno usare la shell bash. .bash_aliases è la posizione preferita per gli alias bash su alcuni sistemi.
ctbrown,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.