내 부울 출력이 이와 같이 동작하는 이유는 무엇입니까? [폐쇄]

내 부울 출력이 이와 같이 동작하는 이유는 무엇입니까? [폐쇄]

본질적으로 제가 말하고 싶은 것은 다음과 같습니다.

if [ X1 ] || [ X2 ]
then
    e1 && a && b && e2
else
    e3
done

그러나 X1과 X2가 FALSE이면 e1, a, b 및 e2는 어쨌든 실행됩니다. X1과 X2가 참인 경우에도 같은 일이 발생합니다. 내 부울 값이 매우 이상하게 동작하는데 그 이유를 모르겠습니다...

다음 코드가 있습니다.

#! /bin/bash

#Define local variables
REPLACING="\033[01;31mReplacing outdated .tex and .json in git repository.\033[0;38m"
COMPLETED="\033[1;38;5;2mTransfer complete.\033[0;38m"
ALL_GOOD="\033[1;38;5;2mYour git repository's templates directory is up to date with your local templates directory connected to TeXStudio IDE.\033[0;38m"

CURRENT_DIR="/Users/jakeireland/Documents/my_macros"

LOCAL_DIR="/Users/jakeireland/.config/texstudio/templates/user/"
GIT_DIR="${CURRENT_DIR}/tea_templates/"

TEX_OLD="${GIT_DIR}*.tex"
JSON_OLD="${GIT_DIR}*.json"

TEX_NEW="${LOCAL_DIR}*.tex"
JSON_NEW="${LOCAL_DIR}*.json"

#Functions to determine congruence of local versus git dir
#cmp -s /path/to/outdated/dir path/to/up-to-date/dir
TEX_CLEAN=$(cmp -s "${TEX_OLD}" "${TEX_NEW}" || echo "tex-err")
JSON_CLEAN=$(cmp -s "${JSON_OLD}" "${JSON_NEW}" || echo "json-err")

#Define functions to copy new files to old directory
#cp -fr /source/file /destination/path
CP_TEX=$(cp -fr ${TEX_NEW} ${GIT_DIR})
CP_JSON=$(cp -fr ${JSON_NEW} ${GIT_DIR})

#Begin script

cd "${CURRENT_DIR}"
if [[ "$TEX_CLEAN" = "tex-err" ]] || [[ "$JSON_CLEAN" = "json-err" ]] ; then 
    echo -e "${REPLACING}" && $CP_TEX && $CP_JSON && echo -e "${COMPLETED}"
else 
    echo -e "${ALL_GOOD}"
fi

답변1

문제가 무엇인지 오해하셨습니다. 예를 들어 추적이 활성화된 상태에서 프로그램을 실행하면 bash -x the_script어떤 일이 발생하는지 확인할 수 있습니다.

다음 줄은 기능을 정의하지 않습니다.

#Define functions to copy new files to old directory
CP_TEX=$(cp -fr ${TEX_NEW} ${GIT_DIR})
CP_JSON=$(cp -fr ${JSON_NEW} ${GIT_DIR})

여기서 일어나는 일은 명령을 실행하고 출력을 이러한 변수 CP_TEX및 에 할당하는 것입니다 CP_JSON.

정말로 함수를 정의하고 싶다면 다음과 같이 작성하세요:

cp_tex() {
   cp -fr ${TEX_NEW} ${GIT_DIR}
}
cp_json() {
    cp -fr ${JSON_NEW} ${GIT_DIR}
}

그러나 일회용의 경우에는 함수를 정의할 필요가 거의 없습니다. 난 그냥 다음과 같이 인라인으로 작성합니다.

cd "${CURRENT_DIR}" || exit $?  # remember that `cd` can fail
if cmp -s "${TEX_OLD}" "${TEX_NEW}" || cmp -s "${JSON_OLD}" "${JSON_NEW}"
then
    echo -e "${ALL_GOOD}"
else
    echo -e "${REPLACING}"
    cp -fr "${TEX_NEW}" "${JSON_NEW}" "${GIT_DIR}"
    echo -e "${COMPLETED}"
fi

물론 이 모든 것은 실제로 이름이 지정된 파일 *.tex과 . *.json이를 와일드카드로 사용하려면 간단한 cmp명령이 아닌 루프를 작성해야 합니다.

관련 정보