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?

È stato utile?

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

  1. aggiungere che script alla PATH
  2. 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:

  1. VI mongobin, in cui sono entrato: cd /Users/jdoe/Desktop/Mongo/db.3.2.1/bin come prima linea.
  2. chmod 755 mongobin
  3. source mongobin
  4. 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}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top