bash 스크립트에서 두 개의 cd 명령을 사용하여 두 번째 명령을 실행하지 않는 이유는 무엇입니까?


15

일련의 디렉토리를 만들고 프로젝트를 선택한 디렉토리에 복제하는 bash 스크립트를 작성했습니다.

이를 cd위해 각 디렉토리 ( project 1project 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$

3
답 중 하나를 받아들이십시오. 하나 이상의 답변이 질문에 대한 해결책 인 경우-최고의 답변을 수락하고 다른 답변을 투표하십시오.
LeonidMew

1
안녕하세요 LeonidMew. 답변을 수락하는 방법을 모르겠습니다. 두 대답 모두 똑같이 좋습니다.
Jenny

5
@Jenny, 서두르지 마십시오. 누군가 내 질문에 대답 할 때 어떻게해야합니까?를 읽으십시오 . 대신 당신이 만족할 때 그에 따라 행동하십시오 . 그냥 시간을내어 서두를 이유가 없습니다. 하루나 일주일 또는 시간에 관계없이 결정해도 괜찮습니다.
PerlDuck

2
@LeonidMew 45 분이 지났는데, 질문을 한 지 오래 걸렸으며, 더 오래 기다리는 것이 A-OK입니다. 더 나은 대답이 나올 수도 있습니다 (PerlDuck의 의견에 따르면 입력하는 동안 팝업이 나타납니다)
Xen2050

6
나는 당신이 무엇을 의도했는지 궁금합니다 exec bash.
추후 공지가있을 때까지 일시 중지되었습니다.

답변:


28

범인은 exec bash일부 기능에 대한 진술입니다. exec문은 조금 이상하고 쉽게 처음부터 이해되지 않습니다. 의미 : 현재 실행중인 command / shell / script 대신 다음 명령 실행하십시오 . 즉 , 현재 쉘 스크립트 (귀하의 경우)를 인스턴스로 바꾸고bash 반환하지 않습니다.

쉘을 사용하여 문제를 시도하고 문제를 해결할 수 있습니다.

exec sleep 5

그러면 현재 쉘 ( bash)이 명령 sleep 5 으로 바뀌고 해당 명령이 5 초 후에 셸로 교체되었으므로 창이 닫힙니다 sleep 5.

스크립트와 동일 : 스크립트에 넣으면 exec something스크립트가 스크립트로 교체 something됩니다.something 실행 중지되면 전체 스크립트가 중지됩니다.

단순히 exec bash진술을 삭제 해야합니다.


2
@ 제니 좋은 소식입니다. 일화 : 펄 언어는 또한이 exec같은 동작으로 문을 당신이 몇몇의 문장을 넣으면 exec (같은 문 exec something; print "This won't run";) 다음 펄이 있음을 경고합니다 print문이 실행되지 얻을 않습니다.
PerlDuck

9
BTW는 cd 다음에 &&를 사용하는 것을 축하합니다 (를 사용하지 않는 경우 set -e). 나는 cd tmp; rm -rf *끔찍한 실패 와 같은 코드를 보았다
eckes

15

보낸 사람 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스크립트 내부에서가, 더 스크립트 실행이 발생할 수 있습니다.


0

시작한 디렉토리로 돌아 가기를 원한다면

cd -

그러나 cd명령이 실행 되었는지 확실하지 않으면 작업 디렉토리를 스택에 넣는 명령을 사용하는 것이 좋습니다.

pushd

(다수의 디렉토리 변경 후에도)

popd

평등 pushdpopd명령 이 있어야 합니다.


2
문제 공간을 읽거나 이해하지 못했습니다. 이 명령들 중 어느 것도 사용자에게 도움이되지 않습니다.
파이프

쉘에서 일부 명령을 실행해야 할 필요성을 읽을 수있는 곳은 없습니다. 그래서 그는 시작 디렉토리로 돌아 가기 위해 bash를 호출했다고 생각했습니다. 당신이 주장 할 수 있습니다 : 그는 누락 된 연속의 이유를 물었고, 이것은 다른 답변에 의해 완벽하게 대답됩니다.
Bernd Wilke πφ 19
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.