bash - Ambito di applicazione variabile per directory-come implementare?




scope environment-variables (5)

Ho una serie di strumenti che ho bisogno di passare i parametri a seconda del progetto su cui sto lavorando. Mi piacerebbe essere in grado di impostare automaticamente un paio di variabili d'ambiente in base alla directory corrente. Così, quando sono passato da una directory all'altra, anche i miei vv di uso comune cambiano. Esempio:

La directory corrente è foo, quindi se lo faccio:

~/foo$ ./myscript --var1=$VAR1

VAR1 avrebbe un valore basato su foo.

Quindi, diciamo che sono passato alla directory dei bar. Se lo faccio:

~/bar$ ./myscript --var1=$VAR1

VAR1 ora dovrebbe avere un valore basato sulla barra.

È possibile? Come?


C'è un direnv che ti aiuta a fare questa roba molto facilmente e in modo elegante. Basta definire un file .envrc nella tua directory del progetto con tutte le variabili env necessarie e lo recupererà una volta inserito il cd in quella cartella.


Che ne dici di avvolgere il tuo script con una funzione (la funzione può essere inserita nel file bash profile / bashrc in quelli di sistema per renderla disponibile per tutti gli utenti).

myscript () { case $PWD in
/path/to/foo) path/to/myscript --var1=$VAR1 ;;
/path/to/bar) path/to/myscript --var2=$VAR1 ;;
*) ;;
case
}

Quindi la funzione myscript chiamerà il vero "myscript" sapendo cosa fare in base alla directory di lavoro corrente.

Prendi questo come esempio:

[email protected]:/tmp$ myscript () { case $PWD in /tmp) echo I\'m in tmp;; /var) echo I\'m in var;; *) echo I\'m neither in tmp nor in bar; esac; }
[email protected]:/tmp$ myscript 
I'm in tmp
[email protected]:/tmp$ cd /var
[email protected]:/var$ myscript 
I'm in var
[email protected]:/var$ cd /etc
[email protected]:/etc$ myscript 
I'm neither in tmp nor in bar

Ho scritto un'altra implementazione di questo, che è in qualche modo simile a ondir. In realtà non conoscevo ondir quando ho iniziato a lavorarci. Ci sono alcune differenze chiave che potrebbero essere utili, comunque.

  • smartcd è interamente scritto in shell ed è completamente compatibile con bash e zsh, anche le opzioni più esoteriche

  • smartcd eseguirà gli script fino in fondo e in alto nella gerarchia delle directory fino al loro antenato comune, non solo per le due directory in entrata e in uscita. Questo significa che puoi avere uno script ~ / foo che verrà eseguito sia che tu "cd ~ / foo" o "cd ~ / foo / bar"

  • ha "stashing variabile" che è un modo più automatico di gestire le variabili d'ambiente, mentre ondir richiede di rimuovere e / o ripristinare le variabili in modo esplicito e manuale

  • smartcd può funzionare con "autocd" attivato agganciando il comando prompt (PROMPT_COMMAND in bash, precmd in zsh)

Puoi trovare smartcd su https://github.com/cxreg/smartcd


Questo non è bello, ma puoi usare una combinazione di variabili di ambiente esportate e il valore di $PWD .

Per esempio:

export VAR1=prefix
export prefix${HOME////_}_foo=42
export prefix${HOME////_}_bar=blah

Quindi myscript bisogno solo di eval echo \${$VAR1${PWD////_}} per ottenere il valore basato sulla directory.


il programma ondir consente di specificare le azioni da eseguire quando si entra e si lasciano le directory in un terminale





working-directory