./script를 사용하지 않고 스크립트에서 디렉토리를 변경하거나 ./script를 호출할 때 스크립트를 종료하는 방법. ./script.sh

./script를 사용하지 않고 스크립트에서 디렉토리를 변경하거나 ./script를 호출할 때 스크립트를 종료하는 방법. ./script.sh

스크립트를 호출하는 사용자를 새 작업 디렉터리로 이동하는 bash 스크립트가 있습니다.

cd 를 사용하여 스크립트를 호출하면 . ./script.sh사용자가 새 디렉터리로 이동하지만 문제는 스크립트에 인수가 전달되지 않으면 스크립트도 종료 명령을 사용하여 사용자의 SSH 세션이 닫히는 것입니다.

스크립트를 호출하지 않고 어떻게 디렉토리를 변경할 수 있습니까 . ./script.sh? 또는 호출할 때 사용자 세션을 종료하지 않고 스크립트를 종료할 수 있습니까 . ./script.sh?

내가 문제가 있는 스크립트 부분은 다음과 같습니다.

 #!/bin/bash

    VAR=$1

    if [[ "$VAR" == "" ]]; then printf "No argument provided, please provide what you want to check.\n"; exit 1; fi

    change_cwd () {
    cd $NEWDIR
    }

change_cwd

종료를 호출하면 ./script.sh예상대로 작동하지만 디렉토리 변경은 사용자 대신 스크립트 하위 쉘로 이루어지지만 . ./script.sh종료를 사용하면 스크립트를 호출하는 사용자의 전체 SSH 세션이 종료됩니다.

이 문제에 대한 해결책은 무엇입니까? bash 스크립트에서 종료 및 cd 작업을 모두 수행하거나 디렉토리를 변경하거나 스크립트를 종료하려면 어떻게 해야 합니까?

요점은 스크립트가 사용자의 작업 디렉터리를 변경하도록 하고, 인수나 인수 오류가 없는 경우 $VAR에 대한 추가 검사를 추가할 계획이므로 나머지 스크립트의 실행을 중지하고 다음으로 돌아가야 한다는 것입니다. 사용자가 다시 스크립트를 실행할 수 있도록 사용자 쉘.

답변1

스크립트가 로 호출되면 ./script상위 프로세스의 현재 디렉터리를 변경할 수 없습니다. 따라서 스크립트를 로 사용해야 합니다 . ./script.

return내장 함수를 사용하여 스크립트를 종료하고 호출자에게 돌아갈 수 있습니다. 이 작업은 함수 외부에서만 수행할 수 있습니다. 함수 내부에서는 return스크립트가 아닌 함수에서 반환됩니다.

스크립트가 소스 코드인 경우 bash가 아닌 사용자 쉘에 의해 실행되므로 다른 쉘(zsh, fish, tcsh 등) 사용자는 스크립트를 사용할 수 없습니다. bash 및 zsh에서 작동하는 스크립트를 작성하는 것은 상대적으로 쉽지만(다음 명령으로 스크립트를 시작하면 emulate -L ksh 2>/dev/null대부분 작동함) Fish 및 tcsh에서도 작동하는 스크립트를 작성하는 것은 훨씬 덜 쉽습니다.

셸 비호환성을 해결하는 또 다른 방법은 선택한 프로그램에 인수를 구문 분석하고 변경할 디렉터리를 결정하는 논리를 작성하는 것입니다. 그런 다음 프로그램에서 호출자 셸의 셸 코드를 인쇄하고 호출자가 스크립트의 출력을 평가하도록 합니다. 따라서 스크립트는 다음과 같은 결과를 출력할 수 있습니다.

cd /some/where

또는

echo "Error: blah blah"; false

그것은 불릴 것이다

eval "`./script`"

또는 tcsh/fish/... 유사체입니다.

답변2

제공된 총 인수 수를 테스트하려면 $#을 사용하십시오. $#이 0이면 종료 명령이 실행되지 않습니다.

Change_cwd 함수가 정의되지 않았기 때문에 어떻게 생겼는지 잘 모르겠지만 $NEWDIR다음은 작동하는 예입니다.

    VAR=$1
    ARGC=$#

    if test $ARGC -eq 0 
    then 
      printf "No argument provided, please provide what you want to check.\n"
    else
      change_cwd ()
      {
        cd $NEWDIR
      }
    fi

(테스트되지 않았지만 요점을 알 수 있습니다 ..)

test -z또는 빈 문자열을 테스트하는 것이 더 깔끔할 수도 있습니다.

답변3

./script는 하위 쉘을 생성하지 않고 현재 쉘에서 스크립트를 실행하기 때문에 스크립트가 ssh 세션을 닫는 중이므로 여기에서 종료하는 것은 현재 대화형 쉘로 간주되므로 세션을 종료하는 것이 정상입니다.

관련 정보