He escrito un script bash que crea una serie de directorios y clona un proyecto en los directorios seleccionados.
Para eso, necesito cdcada directorio ( project 1y project 2), pero el script no lo hace cden el segundo directorio ni ejecuta el comando.
En cambio, se detiene después cdy clona en el project2directorio. ¿Por qué no llama a la cd_project1función en el siguiente código?
#!/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    
}
mainTerminal de salida:
~/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
fuente
                
                fuente

exec bashhacer.Respuestas:
Los culpables son sus
exec bashdeclaraciones en algunas de sus funciones. Laexecdeclaración es un poco extraña y no se entiende fácilmente en primer lugar. Significa: ejecutar el siguiente comando en lugar del comando / shell / script actualmente en ejecución a partir de ahora . Es decir: reemplaza el script de shell actual (en su caso) con una instancia debashy nunca regresa.Puede probar esto con un shell y emitir
Esto reemplazará su shell actual (the
bash) con el comandosleep 5y cuando ese comando regrese (después de 5 segundos) su ventana se cerrará porque el shell ha sido reemplazado porsleep 5.Lo mismo con su secuencia de comandos: si coloca
exec somethingen su secuencia de comandos, la secuencia de comandos se reemplaza consomethingy cuando esosomethingdetiene la ejecución, se detiene toda la secuencia de comandos.Simplemente dejar caer las
exec bashdeclaraciones debe hacer.fuente
execdeclaración con el mismo comportamiento y si coloca algunas declaraciones después de unaexecdeclaración (comoexec something; print "This won't run";), entonces Perl le advertirá que laprintdeclaración nunca se ejecutará.set -e). He visto a Code likecd tmp; rm -rf *fail horribleDe
help exec:La palabra clave aquí es reemplazar : si está
exec bashdentro de una secuencia de comandos, no se puede ejecutar más secuencias de comandos.fuente
si desea volver al directorio que comenzó, puede usar
Pero si no está seguro de si un
cdcomando se ejecutó, sería mejor usar los comandos para colocar directorios de trabajo en una pila:y volver a él (incluso después de múltiples cambios de directorio)
asegúrese de tener igualdad
pushdypopdcomandos.fuente