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 ./scriptlo stesso?
.e sourcesono 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 .bashrcfile, 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.
evalapproccio.
exec bashalla 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 exitper 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, dotglobo 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 cdaccedere 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 bashrco zshrcfile:
# 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.
dotglobo 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
returnper scappare da uno script in questo modo, nonexit- sono come funzioni di shell eexitusciranno dalla shell che ha originato lo script.