스크립트가 돌다가 뭐 하나라도 잘못되면 올스탑 하고 싶어서 set -eo pipefail 걸어뒀음
근데 diff(1)이 Exit status를 0:같음 1:다름 2:에러 로 쓰는걸 아무래도 bash는 가짜에러(1)과 진짜에러(2)를 구분 못해서
걍 정상적으로 diff가 수행되도 에러가 났다고 판단하는거 같음
diff ... || true
이렇게 하면 대충 어찌저찌 할 수 있긴한데 문제는 내가 diff의 값을 tee에 넘겨주고 싶단거임
지금 생각나는 방법은
앞뒤로 set +eo pipefail, set -eo pipefail 걸어주거나 subshell 만들어서 안에서 임시로 shopt disable하고 처리하는건데 두 방식 다 너무 못나보임
혹시 더 좋은 방법 알면 추천좀
파이프 리다이렉션 쓰십쇼
shell pipe redirection? 어떤거 말하는지 잘 모르겟음
redirection
무슨 말인지 모르겠는데 코드로 보여줘봐
일단 { diff ... || true; } | tee ... 이렇게 했는데 원래는 { diff ... || EXIT_CODE=$?; } | tee ...; if [ $EXIT_CODE -eq 2 ]; then exit 1; fi 이런식으로 하고 싶었지만 잘 안되더라 위에 통피가 말해준 redirection 방법은 무슨 말 하는건지 몰라서 못 해봄
집피임
https://wiki.bash-hackers.org/howto/redirection_tutorial
제발 코드로 얘기해줄래? 나에게 뭘 알려주고 싶은지 모르겠어. "에러가 나면 멈추고 싶어서 set -eo pipefail을 썻다. 근데 diff의 작동방식 때문에 문제가 된다. || true를 하면 이를 무시할 순 있지만 이렇게 하면 실제로 에러가 나도 잡지 못해서 아쉽다." <- 여기에 "redirection" 이라고 답하면 내가 "redirection"에 대해 A to Z 로 다 읽어봐야 하는 부분임..? 도대체 무슨 맥락에서 자꾸 "redirection" 답변 해주는건지 모르겠음.
diff의 값을 tee에 넘길때 파이프 쓰란거 아님?
아는척하다가 뽀록나서 튀는거잖아 그만패 ㅋㅋㅋ
튄 건 아니고 딴 짓하다 옴. 뇌 안거치고 redirection 문제겠거니 하고 폰이라 길게 쓰기 귀찮아서 단어만 던져놨는데 글쓴이한테 혼란을 줘서 미안하다.
{ diff ... || EXIT_CODE=$?; } | tee ...; if [ $EXIT_CODE -eq 2 ]; then exit 1; fi 얘는 안되는 이유를 알고 있는지는 모르겠지만 pipe 앞 뒤로 subshell 만드는 것과 같은 효과가 생겨서 상위 shell의 변수에는 아무 영향이 안가기 때문에 원하는 동작을 하지 않음
난 bash의 문법이 좆같다고 느끼기 때문에 사실 어떤 방법을 써도 더럽다고 생각하지만 그나마 이게 제일 깔끔한듯 { diff || [ $? = 1 ]; } | tee ...
아무튼 정말 미안하다. 나였으면 "도움 주기 싫으면 꺼져" 라는 생각이 들었을텐데
나도 본문에 diff ... || true 만 얘기하고 | tee ... 로 넘겨줄 때 $?를 상위 셸로 못넘겨줘서 명시적인 에러체크를 못한다는걸 제대로 적지않아서 알려주는 입장에서도 혼란이 있었을 수 있었다고 생각함. 여튼 마지막에 알려준게 제일 깔끔해보여서 { diff | [ $? -ne 2 ]; } | tee 처럼 해결했다. 계속 꼬치꼬치 물으면 띠꺼워서 런할수도 있었는데 끝까지 답변해줘서 정말 고맙다.