Script per cambiare la directory corrente (cd, pwd)

Voglio eseguire uno script per cambiare semplicemente la directory di lavoro corrente:

#!/bin/bash cd web/www/project 

Ma, dopo averlo eseguito, il pwd corrente rimane invariato! Come posso farlo?

Risposta

È un comportamento previsto. Lo script viene eseguito in una subshell e non può modificare la directory di lavoro della shell principale. I suoi effetti si perdono quando finisce.

Per cambiare la directory della shell corrente in modo permanente dovresti usare il comando source, anchesso con alias semplicemente come ., che esegue uno script nellambiente shell corrente invece che in una sub shell.

I seguenti comandi sono identici:

. script 

o

source script 

Commenti

  • @Sony: Nota che dovresti usare return per uscire da uno script generato in questo modo, non exit – sono come le funzioni della shell e exit uscirà dalla shell che ha originato lo script.
  • @CharlesStewart In effetti, ‘ non ho familiarità con gli script originati. Grazie!
  • è source ./script lo stesso?
  • @amyassin: sì, è
  • 1. . e source sono uguali in bash. 2. Non ‘ Non è necessario utilizzare ./ prima del nome del file se ‘ si trova nella stessa directory. È consentito eseguire solo questo: . script

Answer

Per piccoli compiti come questo, invece di creare uno script, crea un alias come questo,

$ alias cdproj="cd /dir/web/www/proj" 

Dovresti aggiungerlo al tuo .bashrc, se vuoi che sia impostato per ogni shell interattiva.

Ora puoi eseguirlo come $ cdproj.

Commenti

  • Puoi anche fare in modo che lo script echi i comandi da eseguire, quindi utilizzare eval `./script` o eval $(./script) per eseguire quei comandi. Questo è un approccio comune per i comandi che necessitano di aggiornare lambiente di invocazione della shell ‘.
  • Fai solo attenzione a ciò che emetti se hai intenzione di andare lapproccio eval.

Risposta

Usa exec bash alla fine

Uno script bash opera sul suo ambiente corrente o su quello dei suoi figli, ma mai sul suo ambiente genitore.

Tuttavia, questa domanda viene spesso posta perché si desidera essere lasciati alla festa prompt in una determinata directory dopo lesecuzione di uno script bash da unaltra directory.

Se questo è il caso, esegui semplicemente unistanza bash figlio alla fine dello script:

#!/usr/bin/env bash cd desired/directory exec bash 

Questo crea una nuova subshell. Digita Ctrl + D o exit per tornare alla prima shell in cui lo script è stato inizialmente avviato.

Aggiorna

Almeno con le versioni più recenti di bash, il exec sullultima riga non è più richiesto. Inoltre, lo script può essere fatto funzionare con qualsiasi shell preferita utilizzando la variabile dambiente $SHELL. Questo quindi fornisce:

#!/usr/bin/env bash cd desired/directory $SHELL 

Commenti

  • Meglio solo fonte dello script, come nella risposta accettata : lutilizzo di exec è generalmente considerato lultima risorsa di un mascalzone .. 🙂
  • questo trucco non ‘ t lavorare in debian 9 stretch.
  • Questo è il modo sbagliato per farlo!
  • Dato che nessuno ha dettagliato i problemi con questo (ti sto guardando, @Dennis): (1) Ogni volta che lo esegui, crea un nuovo processo di bash persistente. Fallo dieci o venti volte in una sessione e avrai da 11 a 21 processi di bash accumulati. Ciò potrebbe influire sulle prestazioni e, se provi a terminare la sessione in modo pulito digitando exit (o Ctrl + D), dovrai farlo da 11 a 21 volte. (2) Un altro svantaggio dellutilizzo di uno script eseguibile è che, se imposti le opzioni della shell (ad es. dotglob o globstar) nel tuo sessione di shell interattiva, le perderai perché stai iniziando una nuova shell.
  • Soluzione molto bella! Ho ‘ ho riscritto il mio alias in bash_profile, quindi ora è uno script memorizzato in un file separato. Uso lo script per accedere a una cartella temporanea appena creata. E ora è ancora più facile avere una sessione bash temporanea. SRP in azione! Grazie!

Risposta

Sebbene ci siano risposte che eseguono esattamente lazione che desideri, un metodo più standard per tale lo scopo è creare un collegamento simbolico:

ln -s ~/web/www/project proj #use full path to dir! 

Quindi puoi cd alla directory utilizzando il nome proj:

cd proj 

Questo metodo è più flessibile perché puoi accedere ai file utilizzando il nome breve senza cd:

ls proj/ #note the endslash! vim proj/file.x 

Risposta

Dipende da cosa tu “va bene, unaltra soluzione può essere la creazione di una funzione invece di uno script.

Esempio:

Creare una funzione in un file, diciamo /home/aidin/my-cd-script:

function my-cd() { cd /to/my/path } 

quindi includilo nel tuo bashrc o zshrc file:

# Somewhere in rc file source /home/aidin/my-cd-script 

Ora puoi usarlo come un comando:

$ my-cd 

Risposta

Se cambi tra directory lontane nel filesystem. Raccomanderò salto automatico .

Risposta

Per me lapproccio più conveniente e flessibile era un misto di un alias e uno script:

crea script con logica arbitraria

Qui creo uno script che cambia in una directory e attiva lambiente python appropriato. La posizione degli script è esemplificativa in /path/to/workon_myproj.sh.

#!/usr/bin/env bash cd $HOME/workspace/myproj source .venv/bin/activate 

crea un alias da cui proviene lo script

alias workon_myproj="source /path/to/workon_myproj.sh" 

Aggiungi la definizione dellalias nel file di avvio della shell appropriato, ad es. .profile, .bashrc o .zshrc.

risultato

Ora puoi semplicemente eseguire workon_myproj in una shell che fornirà il contenuto del tuo script nella directory desiderata.

estensibilità

Potresti eventualmente migliorare il tuo script per prendere un argomento in modo che funzioni con più progetti in una specifica directory di lavoro, o combinarlo con un git pull per ottenere immediatamente le ultime modifiche e così su … tutto ciò che fai quando continui a lavorare su un progetto specifico.

Risposta

Perché non usare ” exec “sembra che faccia esattamente quello che desidero.

#!/bin/bash cd someplace exec bash ~/someplace 

Commenti

  • Attenzione alle cose che sembra essere ciò che desideri. (Un gigantesco cavallo di legno! Proprio quello che volevo!) Ogni volta che lo esegui, crea un nuovo e persistente processo di bash. Fallo dieci o venti volte in una sessione e avrai da 11 a 21 processi bash impilati. Ciò potrebbe influire sulle prestazioni e, se provi a terminare la sessione in modo pulito digitando exit (o Ctrl + D), dovrai farlo da 11 a 21 volte.
  • Potevo sicuramente vedere dove sarebbe stato un problema. Per me, però, ‘ lo sto usando una volta, facendo il lavoro che mi serve e poi uscendo. Se questo ‘ è lunico inconveniente, può conviverci. Daltra parte, se esiste una soluzione migliore, ‘ sono disposto a esaminarla.
  • La risposta di Aidin a questa domanda , utilizzando una funzione di shell, e la risposta di Sachin Divekar , utilizzando un alias, sono (IMO) soluzioni migliori rispetto allutilizzo di uno script . P.S. Un altro svantaggio dellutilizzo di uno script è che, se imposti delle opzioni di shell (ad es. dotglob o globstar), le perderai, perché stai iniziando una nuova shell. … (Continua)
  • (Continua) … P.P.S. Ho appena notato che, in pratica, stai ripetendo la risposta di Serge Stroobandt e dicendo “Perché non farlo?” Su Stack Exchange ci aspettiamo che le risposte forniscano nuove idee e / o informazioni, e non si limitino a discutere altre risposte.

Risposta

Questo combina la risposta di Serge con una risposta non correlata di David . Cambia la directory e quindi, invece di forzare una shell bash, avvia la shell predefinita dellutente . Tuttavia richiede sia getent e /etc/passwd per rilevare la shell predefinita.

 #!/usr/bin/env bash cd desired/directory USER_SHELL=$(getent passwd <USER> | cut -d : -f 7) $USER_SHELL  

Ovviamente questo ha ancora la stessa deficienza di creare una shell annidata.

Risposta

Puoi farlo utilizzando una funzione o utilizzando & & Gli esempi seguenti installano Zabbix e creano un file con una riga al suo interno.

Es:

#!/bin/bash # Create Function: installZabbix(){ cd /usr/src/zabbix-4.2.4; ./configure --enable-agent; make install; cd /usr/src/; >file; echo "Hi, this is a file." >>file; } # Call the function: installZabbix 

o:

#!/bin/bash cd /usr/src/zabbix-4.2.4 && ./configure --enable-agent && make install && cd /usr/src && >file && echo "Hi, this is a file." >>file 

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *