Alterar o diretório atual de um script Bash

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

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

#!/bin/bash cd /home/artemb 

Quando executo o script do shell Bash, o diretório atual não é alterado. É possível alterar o diretório shell atual de um script?

Você precisa converter seu script em uma function 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 } 

O motivo é que cada processo possui seu próprio diretório atual e, quando você executa um programa a partir do shell, ele é executado em um novo processo. O padrão “cd”, “pushd” e “popd” são embutidos no interpretador de shell para que afetem o processo do shell.

Ao tornar seu programa uma function de shell, você está adicionando seu próprio comando em processo e, em seguida, qualquer alteração de diretório é refletida no processo do shell.

Quando você inicia seu script, é criado um novo processo que herda apenas seu ambiente. Quando termina, acaba. Seu ambiente atual permanece como está.

Em vez disso, você pode iniciar seu script assim:

 . myscript.sh 

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

Tendo em vista a ilegibilidade e a complicação excessiva das respostas, acredito que é isso que o solicitante deve fazer

  1. adicione esse script ao PATH
  2. execute o script como . scriptname . scriptname

O. (ponto) fará com que o script não seja executado em um shell filho.

Colocando o acima em conjunto, você pode fazer um alias

 alias your_cmd=". your_cmd" 

se você não quiser escrever o primeiro “.” cada vez que você quer originar seu script no ambiente de shell, ou se você simplesmente não quer lembrar, deve ser feito para o script funcionar corretamente.

Se você estiver usando bash você pode tentar alias:

no arquivo .bashrc adicione esta linha:

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

quando você escreve “p” na linha de comando, ele irá mudar o diretório.

Se você executar um script bash, ele funcionará no ambiente atual ou nos filhos, nunca no pai.

Se o objective é executar o seu comando: goto.sh / home / test Em seguida, trabalhe interativamente em / home / test. Uma maneira é executar um subshell interativo bash dentro do seu script:

 #!/bin/bash cd $1 exec bash 

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

Com o comando pushd, o diretório atual é colocado na pilha de diretórios e ele é alterado para o diretório fornecido. O popd obtém o diretório no topo da pilha e muda para ele.

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

Simplesmente vá para

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

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

 alias yourcommand="cd /the_path_you_wish" 

Então saia do editor.

Então digite:

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

agora você pode usar: yourcommand in terminal

Eu fiz um script para mudar de diretório. Dê uma olhada: https://github.com/ygpark/dj

Basicamente usamos o cd.. para voltar de todos os diretórios. Eu pensei em tornar mais fácil, dando o número de diretórios com os quais você precisa voltar de cada vez. Você pode implementar isso usando um arquivo de 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 o 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 detalhadamente aqui . Também é explicado por lá como colocar o código em ~ / .bashrc para que cada novo shell aberto tenha automaticamente esse novo comando alias. Você pode adicionar um 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 do git para cá .

Essa 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 para ir para: / Users / jdoe / Desktop / Mongo / db.3.2.1 / bin.

Estes são os passos que podem ter o trabalho feito:

  1. vi mongobin, em que eu 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 criei um utilitário chamado cabra que você pode usar para facilitar a navegação.

Você pode ver o código-fonte no GitHub .

A partir da v2.3.1, a visão geral de uso é assim:

 # 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 projetos diferentes sem triggersr um novo shell.

No seu caso:

 cd /home/artemb 

Salve o script como:

 echo cd /home/artemb 

Então atire com:

 \`./the_script\` 

Então você chega ao diretório usando o mesmo shell.