![./script를 사용하지 않고 스크립트에서 디렉토리를 변경하거나 ./script를 호출할 때 스크립트를 종료하는 방법. ./script.sh](https://linux55.com/image/4702/.%2Fscript%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%A7%80%20%EC%95%8A%EA%B3%A0%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%97%90%EC%84%9C%20%EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC%EB%A5%BC%20%EB%B3%80%EA%B2%BD%ED%95%98%EA%B1%B0%EB%82%98%20.%2Fscript%EB%A5%BC%20%ED%98%B8%EC%B6%9C%ED%95%A0%20%EB%95%8C%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EB%A5%BC%20%EC%A2%85%EB%A3%8C%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95.%20.%2Fscript.sh.png)
스크립트를 호출하는 사용자를 새 작업 디렉터리로 이동하는 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 세션을 닫는 중이므로 여기에서 종료하는 것은 현재 대화형 쉘로 간주되므로 세션을 종료하는 것이 정상입니다.