Почему не делает использования двух команд CD в сценарии удара, выполняют вторую команду?

Я записал сценарий удара, который создает ряд каталогов и клонирует проект к выбранным каталогам.

Для этого я должен 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$
15
задан 15 March 2019 в 06:23

3 ответа

Преступники - Ваш exec bash операторы в некоторых Ваших функциях. exec оператор является немного странным и не понятным во-первых. Это означает: выполните следующую команду вместо в настоящее время рабочей команды/оболочки/сценария отсюда на. Это: это заменяет текущий сценарий оболочки (в Вашем случае) с экземпляром bash и это никогда не возвращается.

Можно испытать это с оболочкой и проблемой

exec sleep 5

Это заменит Вашу текущую оболочку ( bash) с командой sleep 5 и когда та команда возвращается (после 5 секунд), Ваше окно закроется, потому что оболочка была заменена sleep 5.

То же с Вашим сценарием: Если Вы помещаете exec something в Ваш сценарий сценарий заменяется something и когда это something выполнение остановок, целые остановки сценария.

Просто отбрасывание exec bash операторы должны сделать.

28
ответ дан 23 November 2019 в 02:38

От 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 из сценария не может произойти никакое дальнейшее выполнение сценария.

15
ответ дан 23 November 2019 в 02:38

если Вы хотите возврат к каталогу, Вы запустили, Вы могли бы использовать

cd -

Но если Вы не уверены ли a cd команда выполнялась вообще, будет лучше использовать команды для помещения рабочих каталогов на стек:

pushd

и возвратитесь к нему (даже после нескольких изменений каталога)

popd

обязательно имейте одинаково pushd и popd команды.

0
ответ дан 23 November 2019 в 02:38

Другие вопросы по тегам:

Похожие вопросы: