← 노하우 목록

FROM THE WORKSHOP / 노하우

macOS 빨강을 "OS 탓"으로 적기 전에 — bash 3.2는 source 실패가 || true를 뚫는다

macOS 기본 bash 3.2에서는 source 실패가 || true 가드를 무시하고 스크립트를 즉사시킨다. 같은 관용구가 리포지토리 13곳에 깔려 'macOS라서 실패'라는 오진을 낳았다. 선택적 source는 존재 확인을 앞에 두고, 보고서에는 OS 이름 대신 결함 항목의 이름을 적어야 전수 수리가 가능해진다.

강대종 · 마이너스베타스튜디오

macOS 빨강을 “OS 탓”으로 적기 전에 — bash 3.2는 source 실패가 || true를 뚫는다

리눅스 노드에서 전부 초록인 테스트 스윕이 macOS 노드에서만 빨갛게 죽었다. 처음 보고서에는 “macOS라서 실패”라고 적혀 있었다. 실제 원인은 OS가 아니라 한 줄이었다. macOS 기본 /bin/bash는 2007년의 3.2 버전인데, 이 버전에서는 source 없는파일 || true처럼 뒤에 || true를 붙여도 source 실패가 스크립트 전체를 즉사시킨다. 신형 bash에서는 통과하는 관용구가 3.2에서만 치명타가 된다.

같은 패턴이 리포지토리 안 13개 파일에 깔려 있었다. 한 줄짜리 결함이 “macOS 전반이 이상하다”는 인상으로 부풀어 있었던 것이다.

왜 위험한가

  • 실패 지점이 guard 뒤에 숨어 있다. || true를 봤으니 안전하다고 읽고 지나간다.
  • macOS는 라이선스 문제로 bash를 3.2에 영구 고정해 뒀다. brew로 신형을 깔아도 스크립트가 /bin/bash를 부르면 3.2다.
  • 이런 결함은 “macOS라서”라는 뭉뚱그린 진단을 낳고, 그 진단은 아무것도 고치지 못한다.

룰

  1. 선택적 source는 존재 확인을 앞에 둔다: [ -f "$f" ] && source "$f" 또는 if [ -f "$f" ]; then source "$f"; fi. || true는 bash 3.2에서 source를 지켜주지 않는다.
  2. 크로스 플랫폼 스크립트는 최저 버전 기준으로 쓴다. 함대에 macOS가 한 대라도 있으면 bash 3.2가 하한선이다.
  3. 보고서에 “OS 탓”을 적지 않는다. “macOS라서 실패” 대신 결함 항목의 이름(bash 3.2 source 즉사)을 적는다. 이름이 붙어야 grep으로 같은 패턴을 전수 색출할 수 있다.

체크리스트

  1. macOS에서만 빨간 셸 테스트가 있는가? → 먼저 bash --version부터.
  2. source ... || true / source ... || : 패턴이 리포지토리에 몇 개인가? (한 줄 grep으로 나온다)
  3. 진단서에 OS 이름 대신 결함 항목 이름이 적혀 있는가?

한 문장으로. “macOS라서”는 진단이 아니라 진단의 포기다 — 빨강에는 항목 이름을 붙여야 전수 수리가 가능해진다.

기록은 다음 시작이 됩니다.노하우 더 읽기 ↗이 작업장의 제품 ↗
작업장 전체 페이지 목적에 맞는 페이지 찾기