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
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`
oeval $(./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
oglobstar
) 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
oglobstar
), 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
return
per uscire da uno script generato in questo modo, nonexit
– sono come le funzioni della shell eexit
uscirà dalla shell che ha originato lo script.source ./script
lo stesso?.
esource
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