Reddit

GNU coreutils 9.12 released

GNU coreutils 9.12 안정 버전 릴리스 — env 환경 완전 복원, 터미널 출력 안전성 강화

GNU coreutils 9.12 안정 버전이 9.11 이후 21주 만에 공개되었습니다. env의 --env0-from 옵션으로 환경 변수의 완전한 저장·복원이 가능해졌고, 터미널 출력 시 셸 이스케이프 인용이 기본 적용되는 등 안전성이 강화되었습니다. 지난 버전에서 도입된 tee의 무한 루프 회귀를 포함해 다수의 버그가 수정되었습니다.

본문

GNU coreutils 9.12 안정(stable) 릴리스가 2026년 9월 14일 Pádraig Brady에 의해 발표되었습니다. coreutils는 ls, cp, mv, sort, env 등 리눅스와 유닉스 계열 시스템의 기본 명령어 모음으로, 이번 버전은 9.11 이후 21주 동안 16명의 기여자가 288개 커밋을 올린 결과물입니다. Pádraig Brady가 118개, Collin Funk이 98개, Sylvestre Ledru가 33개의 커밋을 기여했습니다.

주요 신규 기능과 동작 변화

가장 눈에 띄는 신기능은 env의 --env0-from=FILE 옵션입니다. NUL 문자로 구분된 환경 변수 목록을 파일에서 읽어들이며, -i 옵션과 조합하면 중복되거나 비표준적인 항목까지 그대로 보존되어 환경의 완전한 왕복(round-tripping) 저장·복원이 가능합니다. 'env -i --env0-from=<( env -0 | sed -z ... )' 같은 방식으로 필터링에도 활용할 수 있습니다. stat과 tail은 failfs와 nullfs 파일시스템 타입을 새로 인식하며, stat -f -c%T가 해당 타입을 보고하고 tail -f는 inotify를 사용합니다. uname에는 모든 출력 항목에 한 줄씩 라벨을 붙이는 -A, --all-labeled 옵션이 추가되었습니다.

동작 변화도 큽니다. env와 printenv는 이제 출력되는 환경 변수를 QUOTING_STYLE 환경 변수를 따라 인용하며, 기본값은 shell-escape 방식입니다. 임의의 데이터가 터미널에 그대로 출력되는 것을 막고, 출력을 POSIX 셸에서 source할 수 있게 합니다. stat도 필요 시 셸 인용을 사용해 파일명을 더 견고하게 이스케이프하며, 기존 %n과 별도로 인용된 파일명을 출력하는 %Qn 포맷 조합이 새로 지원됩니다. ls -w, --width는 줄 너비 계산에 '\n'을 포함하지 않아 너비와 $COLUMNS가 '포함 최대값'으로 해석됩니다.

버그 수정 — 회귀와 오래된 결함

9.11에서 도입된 회귀가 여럿 바로잡혔습니다. tee는 모든 출력을 쓴 뒤 write 호출이 EAGAIN을 설정할 때 무한 루프에 빠지던 문제와 short write를 오류로 처리하던 문제가 수정되었습니다. cut -d에서 다중 멀티바이트 구분자를 지정할 때 마지막 구분자가 올바르게 매칭되며, unexpand -t의 힙 버퍼 오버플로도 해결되었습니다. 한편 '태초부터' 존재했다고 표기된 오래된 결함들도 다수 수정되었는데, chcon·chgrp·chmod·chown·du·ls의 -R 순회가 병렬로 파일이 삭제되는 중이라는 이유만으로 실패하지 않게 되었고, ptx -G와 ptx -W의 무한 루프, shred가 리더 없는 FIFO를 열 때 블로킹되던 문제, test가 이진 연산자의 피연산자로 주어진 '-a'·'-o' 문자열을 연산자로 오인하던 문제 등이 포함됩니다. 보안 관련으로는 factor의 버퍼 over-read(CWE-126), 멀티바이트 로케일에서 uniq -w의 읽기 버퍼 오버런, SHIFT-JIS 같은 레거시 로케일에서 wc가 룩업 테이블 끝을 넘어 읽던 문제가 수정되었습니다. 또한 cp·install·mv는 --reflink=auto 클론이 EDQUOT·ENOMEM·ENOSPC로 실패할 경우 표준 복사로 폴백합니다.

성능과 빌드 개선

sort는 파이프처럼 크기를 알 수 없는 입력을 읽을 때 가용 메모리와 병렬 처리를 더 잘 활용하며, uniq -c는 unlocked stdio 함수가 있는 시스템에서 최대 2.5배 빨라졌고, cut -w는 멀티바이트 로케일에서 일반적인 입력 기준 처리량이 4배 향상되었습니다. basename·dirname·du·readlink·realpath는 표준 출력이 터미널일 때 shell-escape 방식으로 인용하고, ls는 구분자와 모호해질 수 있는 파일명 내 개행을 터미널 출력 여부와 무관하게 치환합니다. --with-wtmpdb로 빌드하면 who와 users가 wtmpdb 데이터베이스를 사용해 Y2038-safe해집니다. 빌드 측면에서는 Linux AF_ALG API를 쓰던 --with-linux-crypto 옵션이 제거되었는데, 이 API는 Linux 7.2에서 폐지 예정이고 OpenSSL보다 성능이 낮기 때문입니다. --enable-systemd는 --with-systemd로 이름이 바뀌었고, sort 바이너리는 .note.dlopen ELF 노트로 libcrypto 의존성을 표시합니다.

Reddit 반응

  • @StefanOrvarSigmundss — Ubuntu가 coreutils를 더 오래 유지했으면 좋았겠다고 말합니다. Rust 재작성 자체에는 반대하지 않지만 uutils는 아직 실전 투입 준비가 안 됐다며, Ubuntu Server 26.04에서 mkdir을 ACL과 함께 쓸 때 예측 불가능한 동작을 겪었고 몇 시간의 트러블슈팅 끝에 1년 이상 된 알려진 이슈임을 확인했다고 합니다.
  • @DazzlingAd4254 — kubuntu 26.04에서 GNU coreutils로 되돌렸다고 밝힙니다. uutils의 date(1) man 페이지가 상당히 부실했기 때문이라고 설명합니다.
  • @_Super_Straight — Rust로 구현됐는지 아니면 기존 C인지 물었고, 이 댓글은 대량의 반대표(-64)를 받았습니다. 본인은 간단한 예/아니오 답이면 될 질문에 사람들이 과민 반응한다고 불평했습니다.

원문: Reddit / 번역·요약: Trawling