Pergunta

É possível alterar o diretório atual a partir de um script?

Eu quero criar um utilitário para navegação diretório no Bash. Eu criei um script de teste que se parece com o seguinte:

#!/bin/bash
cd /home/artemb

Quando eu executar o script do Shell Bash o diretório atual não muda. É possível a todos para mudar o diretório shell atual a partir de um script?

Foi útil?

Solução

Você precisa converter seu script para uma função 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
}

A razão é que cada processo tem seu próprio diretório atual, e quando você executar um programa a partir do shell que é executado em um novo processo. O "cd" standard, "pushd" e "popd" está embutido para o interpretador shell para que eles afetam o processo shell.

Ao fazer o seu programa uma função shell, você está adicionando o seu próprio comando em processo e, em seguida, qualquer alteração diretório se reflete no processo shell.

Outras dicas

Quando você começar o seu roteiro, um novo processo é criado que só herda seu ambiente. Quando ele termina, ele termina. Seus atuais estadias ambiente como ele é.

Em vez disso, você pode começar seu roteiro como este:

. myscript.sh

O . irá avaliar o script no ambiente atual, por isso pode ser alterado

À luz da ilegibilidade e overcomplication de respostas, eu acredito que este é o que o solicitante deve fazer

  1. adicionar esse script ao PATH
  2. executar o script como . scriptname

O . (ponto) irá certificar-se o script não é executado em um shell filho.

Colocar o conjunto acima, você pode fazer um alias

alias your_cmd=". your_cmd"

Se você não quiser escrever a principal "" cada vez você quer a fonte de seu script para o ambiente shell, ou se você simplesmente não quer se lembrar que deve ser feito para o script para funcionar corretamente.

Se você estiver usando bash, você pode tentar apelido:

no arquivo .bashrc adicionar esta linha:

alias p='cd /home/serdar/my_new_folder/path/'

quando você escreve "p" na linha de comando, ele irá alterar o diretório.

Se você executar um script, então ele irá opera em seu ambiente atual ou sobre as de seus filhos, não no pai.

Se o objetivo é executar o seu comando: goto.sh / home / test Em seguida, trabalhar interativamente em / home / test é uma maneira de executar um subshell interativo festa dentro do seu script:

#!/bin/bash
cd $1
exec bash

Desta forma, você estará em / home / test até sair (exit ou Ctrl + C) deste shell.

Com pushd o diretório atual é empurrado na pilha diretório e ele é alterado para o dado diretório, popd obter o diretório no topo da pilha e muda então para -lo.

pushd ../new/dir > /dev/null
# do something in ../new/dir
popd > /dev/null

Basta ir ao

yourusername/.bashrc (or yourusername/.bash_profile on MAC) by an editor

e adicionar este código ao lado da última linha:

alias yourcommand="cd /the_path_you_wish"

Em seguida, sair editor.

Em seguida, digite:

source ~/.bashrc or source ~/.bash_profile on MAC.

Agora você pode usar: yourcommand no Terminal

Eu fiz um script para alterar diretório. dar uma olhada: https://github.com/ygpark/dj

Basicamente, usamos cd.. voltar de cada diretório. Eu pensei para torná-lo mais fácil, dando o número de diretórios com o qual você precisa voltar em um momento. Você pode implementar isso usando um arquivo script separado usando o comando alias. Por exemplo:

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'   

Depois de usar source code.sh no shell atual você pode usar:

$back 2 

para vir dois passos para trás a partir do diretório atual. Explicado em detalhes sobre aqui . Também é explicado por lá como colocar o código em ~ / .bashrc para que cada novo shell aberto terão automaticamente este novo comando alias. Você pode adicionar novo comando para ir para diretórios específicos, modificando o código, adicionando mais if conditions e argumentos diferentes. Você também pode puxar o código git sobre aqui .

Esta abordagem é mais fácil para mim.

Suponha que em um iMac pessoal onde você é um administrador, sob o diretório padrão quando uma janela de comando é aberta, / Users / jdoe, este será o diretório ir em: / Users / ze / Desktop / Mongo / db. 3.2.1 / bin.

Estas são as etapas que podem ter o trabalho feito:

  1. vi mongobin, em que entrei: cd /Users/jdoe/Desktop/Mongo/db.3.2.1/bin como a primeira linha.
  2. chmod 755 mongobin
  3. source mongobin
  4. pwd

Voila!

Eu também criou um utilitário chamado cabra que você pode usar para facilitar a navegação.

Você pode ver o código fonte em GitHub .

A partir de v2.3.1 o descrição uso esta aparência:

# 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

Eu gosto de fazer a mesma coisa para diferentes projetos sem disparar um novo shell.

No seu caso:

cd /home/artemb

Save the_script como:

echo cd /home/artemb

Em seguida, aquecê-la com:

\`./the_script\`

Então você começa para o diretório usando o mesmo shell.

Adicionar abaixo da linha cd em sua shellscript isto:

exec $SHELL

Declare seu caminho:

PATH='/home/artemb'     
cd ${PATH}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top