Voglio eseguire uno script per cambiare semplicemente la directory di lavoro corrente:
#!/bin/bash
cd web/www/project
Ma, dopo averlo eseguito, l'attuale pwd rimane invariato! Come lo posso fare?
Voglio eseguire uno script per cambiare semplicemente la directory di lavoro corrente:
#!/bin/bash
cd web/www/project
Ma, dopo averlo eseguito, l'attuale pwd rimane invariato! Come lo posso fare?
Risposte:
È un comportamento previsto e già discusso più volte.
Lo script viene eseguito in una subshell e non può modificare la directory di lavoro della shell padre. I suoi effetti si perdono quando finisce.
Per modificare la directory in modo permanente è necessario eseguire il source dello script, come in
. ./script
source ./script
lo stesso?
.
e source
sono uguali in bash. 2. non è necessario utilizzare ./
prima del nome file se si trova nella stessa directory. Va bene eseguire solo questo:. script
Per piccole attività come questa, invece di creare uno script, crea un alias come questo,
$ alias cdproj='cd /dir/web/www/proj'
Dovresti aggiungerlo al tuo .bashrc
file, se lo desideri impostato per ogni shell interattiva.
Ora puoi eseguirlo come $ cdproj
.
eval `./script`
o eval $(./script)
per eseguire tali comandi. Questo è un approccio comune per i comandi che devono aggiornare l'ambiente della shell che invoca.
eval
approccio.
exec bash
alla fineUno script bash opera nel suo ambiente attuale o in quello dei suoi figli, ma mai nel suo ambiente genitore.
Tuttavia, questa domanda viene spesso posta perché si desidera essere lasciati al prompt di bash in una determinata directory dopo l'esecuzione di uno script bash da un'altra directory.
In tal caso, eseguire semplicemente un'istanza bash figlio alla fine dello script:
#!/usr/bin/env bash
cd desired/directory
exec bash
Questo crea una nuova subshell. Digitare exit
per tornare alla prima shell in cui lo script è stato inizialmente avviato.
exec
è in genere considerato l'ultima risorsa di un mascalzone .. :)
exit
(o Ctrl + D), è necessario farlo dalle 11 alle 21 volte. (2) Un altro svantaggio dell'uso di uno script eseguibile è che, se si impostano opzioni di shell (ad esempio, dotglob
o globstar
) nella sessione di shell interattiva, le si perderanno, poiché si avvia una nuova shell.
Mentre ci sono risposte che eseguono esattamente l'azione desiderata, un metodo più standard per tale scopo è quello di creare un collegamento simbolico:
ln -s ~/web/www/project proj #use full path to dir!
Quindi è possibile cd
accedere alla directory utilizzando il nome proj
:
cd proj
Questo metodo è più flessibile perché è possibile accedere ai file utilizzando il nome breve senza cd
:
ls proj/ #note the endslash!
vim proj/file.x
Dipende da cosa hai intenzione di fare, un'altra soluzione può essere quella di creare una funzione anziché uno script.
Esempio:
Crea 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
Perché non usare "exec" cuciture per fare esattamente quello che desidero.
#!/bin/bash
cd someplace
exec bash
~/someplace
exit
(o Ctrl + D), è necessario farlo dalle 11 alle 21 volte.
dotglob
o globstar
), le perderai, perché stai avviando una nuova shell. ... (proseguendo)
Puoi farlo usando una funzione o usando && Gli esempi seguenti installano Zabbix e creano un file con una linea al suo interno.
Ex:
#!/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 scappare da uno script in questo modo, nonexit
- sono come funzioni di shell eexit
usciranno dalla shell che ha originato lo script.