Altere o diretório atual de um script Bash
-
22-08-2019 - |
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?
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
- adicionar esse script ao
PATH
- 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:
- vi mongobin, em que entrei:
cd /Users/jdoe/Desktop/Mongo/db.3.2.1/bin
como a primeira linha. -
chmod 755 mongobin
-
source mongobin
-
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}