Я записал сценарий удара, который создает ряд каталогов и клонирует проект к выбранным каталогам.
Для этого я должен 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$
Преступники - Ваш exec bash
операторы в некоторых Ваших функциях. exec
оператор является немного странным и не понятным во-первых. Это означает: выполните следующую команду вместо в настоящее время рабочей команды/оболочки/сценария отсюда на. Это: это заменяет текущий сценарий оболочки (в Вашем случае) с экземпляром bash
и это никогда не возвращается.
Можно испытать это с оболочкой и проблемой
exec sleep 5
Это заменит Вашу текущую оболочку ( bash
) с командой sleep 5
и когда та команда возвращается (после 5 секунд), Ваше окно закроется, потому что оболочка была заменена sleep 5
.
То же с Вашим сценарием: Если Вы помещаете exec something
в Ваш сценарий сценарий заменяется something
и когда это something
выполнение остановок, целые остановки сценария.
Просто отбрасывание exec bash
операторы должны сделать.
От help exec
:
exec: exec [-cl] [-a name] [command [arguments ...]] [redirection ...] Replace the shell with the given command. Execute COMMAND, replacing this shell with the specified program. ARGUMENTS become the arguments to COMMAND. If COMMAND is not specified, any redirections take effect in the current shell.
Ключевое слово здесь является заменой - если Вы exec bash
из сценария не может произойти никакое дальнейшее выполнение сценария.
если Вы хотите возврат к каталогу, Вы запустили, Вы могли бы использовать
cd -
Но если Вы не уверены ли a cd
команда выполнялась вообще, будет лучше использовать команды для помещения рабочих каталогов на стек:
pushd
и возвратитесь к нему (даже после нескольких изменений каталога)
popd
обязательно имейте одинаково pushd
и popd
команды.