Я написал скрипт bash, который создает серию каталогов и клонирует проект в выбранные каталоги.
Для этого мне нужно в cd
каждый каталог ( project 1
и project 2
), но скрипт не переходит cd
во второй каталог и не выполняет команду.
Вместо этого он останавливается после cd
клонирования и в project2
каталоге. Почему он не вызывает cd_project1
функцию в следующем коде?
#!/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
Терминальный выход:
~/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
Дженни
источник
источник
exec bash
сделать.Ответы:
Виновными являются ваши
exec bash
высказывания в некоторых ваших функциях. Этоexec
утверждение немного странно и, во-первых, его нелегко понять. Это значит: выполнить следующую команду вместо текущей запущенной команды / оболочки / скрипта с этого момента . То есть: он заменяет текущий сценарий оболочки (в вашем случае) экземпляромbash
и никогда не возвращается.Вы можете попробовать это с оболочкой и выпустить
Это заменит вашу текущую оболочку (
bash
) на команду,sleep 5
и когда эта команда вернется (через 5 секунд), ваше окно закроется, потому что оболочка была заменена наsleep 5
.То же самое с вашим сценарием: если вы добавите его
exec something
в сценарий, сценарий будет заменен на,something
а когда онsomething
остановится, весь сценарий остановится.Просто отбросить
exec bash
заявления должны сделать.источник
exec
заявление с таким же поведением , и если вы положили некоторые заявления после сexec
заявлением (напримерexec something; print "This won't run";
) , то Perl будет предупреждать вас о том , чтоprint
заявление никогда не будут выполнены.set -e
). Я видел кодекс какcd tmp; rm -rf *
провал ужасноОт
help exec
:Ключевое слово здесь заменить - если вы
exec bash
внутри скрипта, дальнейшее выполнение скрипта не может произойти.источник
если вы хотите вернуться в каталог, который вы начали, вы можете использовать
Но если вы не уверены, была ли вообще выполнена
cd
команда, было бы лучше использовать команды для помещения рабочих каталогов в стек:и вернуться к нему (даже после нескольких изменений каталога)
обязательно иметь равные
pushd
иpopd
команды.источник