>

Bash 스크립트의 "if"조건에서 "cd"를 수행하려고합니다. "if"다음에 동일한 디렉토리에 있습니다. 따라서 "if"외부에서 "cd"를 수행 한 다음 $를 사용해야합니까? if의 값. 이 추가 단계를 사용하지 않는 방법이 있습니까? 가능한 가장 짧은 방법은 무엇입니까?

내 코드의 세 가지 변형보기 :

#!/bin/bash
set +e
# If I write the following:
if ! (rm -rf sim && mkdir sim && cd sim); then
    echo $0: Cannot prepare simulation directory
    exit 1
fi
# it does not change the current directory
echo $PWD
# Also, if I write the following:
if ! rm -rf sim || ! mkdir sim || ! cd sim; then
    echo $0: Cannot prepare simulation directory
    exit 1
fi
# it also does not change the current directory
echo $PWD
# In order to change the current directory, I need to write:
rm -rf sim && mkdir sim && cd sim
if [ $? -eq 1 ]; then
    echo $0: Cannot prepare simulation directory
    exit 1
fi
# Now it prints .../sim
echo $PWD
cd ..
# Is it possible to write it without an additional line with $?
exit


  • 답변 # 1

    bash의 고뇌는 하위 쉘을 만듭니다- fork() 자체 환경 변수, 자체 현재 디렉토리 등을 가진 쉘의 사본을 제거합니다. 따라서 첫 번째 시도에서 cd  닫는 en이 서브 쉘을 종료 할 때까지만 적용되었습니다.(POSIX는이 서브 쉘 동작을 엄격하게 요구하지는 않지만, 괄호로 작성된 환경에는 자체 작업 디렉토리가 있어야합니다. cd 의 효과는 해당 쉘이 실제로 fork() 를 사용하는지 여부에 관계없이 모든 표준 호환 쉘에 적용됩니다.  여기 모든 상황에서).

    서브 쉘을 생성하지 않으려는 경우 그룹화 할 때는 괄호가 아닌 중괄호를 사용하십시오. 즉 :

    if ! { rm -rf sim && mkdir sim && cd sim; }; then
        echo "$0: Cannot prepare simulation directory"
        exit 1
    fi
    
    
    <시간>

    즉, 두 번째 접근 방식은완벽하게 잘 작동합니다(전통적인 관용구가 아닌 쓰기는 다루기 힘들지만).

    bash <<'EOF'
    cd /tmp
    echo "Starting in $PWD"
    if ! rm -rf sim || ! mkdir sim || ! cd sim; then
        echo "$0: Cannot prepare simulation directory"
        exit 1
    fi
    echo "Ending in $PWD"
    EOF
    
    

    ... 적절하게 방출합니다 :

    Starting in /tmp
    Ending in /tmp/sim
    
    

관련 자료

  • 이전 HTTPS 및 하위 도메인을 사용하여 호스팅
  • 다음 machine learning - 컨벌루션 작업의 예기치 않은 결과