He escrito un script bash que crea una serie de directorios y clona un proyecto en los directorios seleccionados.
Para eso, necesito cd
cada directorio ( project 1
y project 2
), pero el script no lo hace cd
en el segundo directorio ni ejecuta el comando.
En cambio, se detiene después cd
y clona en el project2
directorio. ¿Por qué no llama a la cd_project1
funció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
}
main
Terminal 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 bash
hacer.Respuestas:
Los culpables son sus
exec bash
declaraciones en algunas de sus funciones. Laexec
declaració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 debash
y nunca regresa.Puede probar esto con un shell y emitir
Esto reemplazará su shell actual (the
bash
) con el comandosleep 5
y 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 something
en su secuencia de comandos, la secuencia de comandos se reemplaza consomething
y cuando esosomething
detiene la ejecución, se detiene toda la secuencia de comandos.Simplemente dejar caer las
exec bash
declaraciones debe hacer.fuente
exec
declaración con el mismo comportamiento y si coloca algunas declaraciones después de unaexec
declaración (comoexec something; print "This won't run";
), entonces Perl le advertirá que laprint
declaració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 bash
dentro 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
cd
comando 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
pushd
ypopd
comandos.fuente