Cambiare la directory corrente da uno script Bash
-
22-08-2019 - |
Domanda
E 'possibile cambiare la directory corrente da uno script?
Voglio creare un programma di utilità per la navigazione directory in Bash. Ho creato uno script di test che appare come il seguente:
#!/bin/bash
cd /home/artemb
Quando eseguo lo script dalla shell Bash directory corrente non cambia. E 'possibile a tutti di modificare la directory shell corrente da uno script?
Soluzione
È necessario convertire il vostro script per una funzione di shell:
#!/bin/bash
#
# this script should not be run directly,
# instead you need to source it from your .bashrc,
# by adding this line:
# . ~/bin/myprog.sh
#
function myprog() {
A=$1
B=$2
echo "aaa ${A} bbb ${B} ccc"
cd /proc
}
La ragione è che ogni processo ha la propria directory corrente, e quando si esegue un programma dalla shell viene eseguito in un nuovo processo. Il "cd" standard, "pushd" e "popd" sono builtin per l'interprete di shell in modo che essi influenzano il processo shell.
Per rendere il vostro programma di una funzione di shell, si sta aggiungendo il proprio comando in-process e quindi ogni cambiamento di directory si riflette nel processo shell.
Altri suggerimenti
Quando si avvia lo script, un nuovo processo è creato che eredita solo il vostro ambiente. Quando finisce, finisce. Il tuo attuale ambiente rimane così com'è.
Invece, è possibile avviare lo script in questo modo:
. myscript.sh
Il .
valuterà lo script nel contesto attuale, quindi potrebbe essere alterato
Alla luce della illeggibilità e overcomplication di risposte, credo che questo sia ciò che il richiedente deve fare
- aggiungere che script alla
PATH
- eseguire lo script come
. scriptname
Il .
(dot) farà in modo che lo script non viene eseguito in un guscio di bambino.
Mettere quanto sopra insieme, è possibile creare un alias
alias your_cmd=". your_cmd"
se non si desidera scrivere il leader "" ogni volta si vuole ottenere il tuo script per l'ambiente di shell, o se semplicemente non si vuole ricordare che deve essere fatto per lo script per funzionare correttamente.
Se si sta usando bash si può provare alias:
nel file .bashrc aggiungere questa riga:
alias p='cd /home/serdar/my_new_folder/path/'
quando si scrive "p" sulla riga di comando, cambierà la directory.
Se si esegue uno script bash allora sarà opera sul suo ambiente attuale o su quelli dei suoi figli, mai sul genitore.
Se obiettivo è quello di eseguire il comando: goto.sh / home / test Poi lavorare in modo interattivo in / home / prova un modo è quello di eseguire una subshell interattivo bash all'interno del tuo script:
#!/bin/bash
cd $1
exec bash
In questo modo si sarà in / home / test fino a quando si esce (exit o Ctrl + C) di questo guscio.
pushd la directory corrente viene spinto sulla pila di directory ed è cambiato nella directory data, popd ottenere la directory in cima alla pila e cambia poi a esso.
pushd ../new/dir > /dev/null
# do something in ../new/dir
popd > /dev/null
Basta andare
yourusername/.bashrc (or yourusername/.bash_profile on MAC) by an editor
e aggiungere questo codice successivo all'ultima riga:
alias yourcommand="cd /the_path_you_wish"
quindi chiudere l'editor.
Quindi digitare:
source ~/.bashrc or source ~/.bash_profile on MAC.
ora è possibile utilizzare: yourcommand nel terminale
Ho fatto uno script per cambiare directory. Date un'occhiata: https://github.com/ygpark/dj
In pratica usiamo cd..
tornare da ogni directory. Ho pensato di rendere più facile, dando il numero di directory con i quali è necessario tornare alla volta. È possibile implementare questo utilizzando un file di script separato con il comando alias. Ad esempio:
code.sh
#!/bin/sh
_backfunc(){
if [ "$1" -eq 1 ]; then
cd ..
elif [ "$1" -eq 2 ]; then
cd ../..
elif [ "$1" -eq 3 ]; then
cd ../../..
elif [ "$1" -eq 4 ]; then
cd ../../../..
elif ["$1" -eq 10]; then
cd /home/arun/Documents/work
fi
}
alias back='_backfunc'
Dopo aver utilizzato source code.sh
nella shell corrente è possibile utilizzare:
$back 2
a venire due passi indietro dalla directory corrente. Spiegato in dettaglio nel corso qui . Viene anche spiegato lì come mettere il codice in ~ / .bashrc in modo che ogni nuova shell aperto avrà automaticamente questo nuovo comando alias. È possibile aggiungere nuovo comando per andare alla directory specifiche modificando il codice con l'aggiunta di ulteriori if conditions
e argomenti diversi. È anche possibile estrarre il codice da Git su qui .
Questo approccio è più facile per me.
Supponiamo che su un iMac personale in cui si è un amministratore, sotto la directory predefinita quando viene aperta una finestra di comando, / Users / jdoe, questa sarà la directory di andare a: / Users / jdoe / Desktop / Mongo / db. 3.2.1 / bin.
Questi sono i passi che possono avere il lavoro fatto:
- VI mongobin, in cui sono entrato:
cd /Users/jdoe/Desktop/Mongo/db.3.2.1/bin
come prima linea. -
chmod 755 mongobin
-
source mongobin
-
pwd
Voila!
Ho anche creato un'utility chiamata capra che è possibile utilizzare per facilitare la navigazione.
È possibile visualizzare il codice sorgente su GitHub .
v2.3.1 panoramica utilizzo assomiglia a questo:
# Create a link (h4xdir) to a directory:
goat h4xdir ~/Documents/dev
# Follow a link to change a directory:
cd h4xdir
# Follow a link (and don't stop there!):
cd h4xdir/awesome-project
# Go up the filesystem tree with '...' (same as `cd ../../`):
cd ...
# List all your links:
goat list
# Delete a link (or more):
goat delete h4xdir lojban
# Delete all the links which point to directories with the given prefix:
goat deleteprefix $HOME/Documents
# Delete all saved links:
goat nuke
# Delete broken links:
goat fix
mi piace fare la stessa cosa per diversi progetti senza sparare una nuova shell.
Nel tuo caso:
cd /home/artemb
Salva the_script come:
echo cd /home/artemb
Durante la cottura con:
\`./the_script\`
Poi si arriva alla directory utilizzando la stessa shell.
Aggiungi sotto la linea cd nel vostro shellscript questo:
exec $SHELL
Dichiarare il vostro percorso:
PATH='/home/artemb'
cd ${PATH}