Eu escrevi um script bash que cria uma série de diretórios e clona um projeto para diretórios selecionados.
Para isso, preciso de cd
cada diretório ( project 1
e project 2
), mas o script não faz cd
para o segundo diretório nem executa o comando.
Em vez disso, ele pára cd
e é clonado no project2
diretório Por que não chama a cd_project1
função no código a seguir?
#!/bin/bash
#Get the current user name
function my_user_name() {
current_user=$USER
echo " Current user is $current_user"
}
#Creating useful directories
function create_useful_directories() {
if [[ ! -d "$scratch" ]]; then
echo "creating relevant directory"
mkdir -p /home/"$current_user"/Downloads/scratch/"$current_user"/project1/project2
else
echo "scratch directory already exists"
:
fi
}
#Going to project2 and cloning
function cd_project2() {
cd /home/"$current_user"/Downloads/scratch/"$current_user"/project1/project2 &&
git clone https://username@bitbucket.org/teamsinspace/documentation-tests.git
exec bash
}
#Going to project1 directory and cloning
function cd_project1() {
cd /home/"$current_user"/Downloads/scratch/"$current_user"/project1/ &&
git clone https://username@bitbucket.org/teamsinspace/documentation-tests.git
exec bash
}
#Running the functions
function main() {
my_user_name
create_useful_directories
cd_project2
cd_project1
}
main
Saída terminal:
~/Downloads$. ./bash_install_script.sh
Current user is mihi
creating relevant directory
Cloning into 'documentation-tests'...
remote: Counting objects: 125, done.
remote: Compressing objects: 100% (115/115), done.
remote: Total 125 (delta 59), reused 0 (delta 0)
Receiving objects: 100% (125/125), 33.61 KiB | 362.00 KiB/s, done.
Resolving deltas: 100% (59/59), done.
~/Downloads/scratch/mihi/project1/project2$
bash
scripts
cd-command
Jenny
fonte
fonte
exec bash
fazer.Respostas:
Os culpados são suas
exec bash
declarações em algumas de suas funções. Aexec
afirmação é um pouco estranha e não é facilmente compreendida em primeiro lugar. Significa: execute o seguinte comando em vez do comando / shell / script atualmente em execução a partir de agora . Ou seja: ele substitui o script atual do shell (no seu caso) por uma instância debash
e nunca retorna.Você pode tentar isso com um shell e emitir
Isso substituirá seu shell atual (the
bash
) pelo comandosleep 5
e quando esse comando retornar (após 5 segundos) sua janela será fechada porque o shell foi substituído porsleep 5
.O mesmo com o seu script: se você
exec something
inserir o script, o script será substituído porsomething
e, quando issosomething
interromper a execução, o script inteiro será interrompido.Simplesmente largar as
exec bash
declarações deve servir.fonte
exec
declaração com o mesmo comportamento e, se você colocar algumas declarações após umaexec
declaração (comoexec something; print "This won't run";
), o Perl avisará que aprint
declaração nunca será executada.set -e
). Eu vi Código comocd tmp; rm -rf *
falha horrívelDe
help exec
:A palavra-chave aqui é substituir - se você estiver
exec bash
dentro de um script, nenhuma execução adicional poderá ocorrer.fonte
se você quiser retornar ao diretório que você iniciou, poderá usar
Mas se você não tiver certeza se um
cd
comando foi executado, seria melhor usar os comandos para colocar diretórios de trabalho em uma pilha:e retorne a ele (mesmo após várias alterações de diretório)
certifique-se de ter equaly
pushd
epopd
comandos.fonte