Coreutils - 거절된 기능 요청들
요약
본 기사는 Coreutils 개발 과정에서 거절된 기능 요청들을 정리하고, 각 요청별로 채택되지 않은 이유와 대안을 제시합니다. 핵심은 새로운 기능을 추가하기보다 기존 도구들의 조합이나 더 낮은 계층의 솔루션을 활용하는 것이 효율적이라는 점입니다.
핵심 포인트
- 새로운 기능보다는 기존 도구 조합 사용 권장
- 범용성, 구현 복잡도, 표준 호환성이 판단 기준
- 파일 시스템 독립적인 인터페이스 필요성 제기
- 복사/권한 변경 등은 rsync나 find 같은 상위 도구 활용
Coreutils는 기존 도구로 충분히 구현할 수 있거나 복잡성에 비해 효용이 작은 기능 요청을 채택하지 않았으며, 요청별 거절 이유와 메일링 리스트 논의를 정리해 둠기존 도구의 조합이 여러 기능 요청의 대안이 됨.cp --resume
에는rsync
,du --sort
에는du -h | sort -h
, 재귀적touch
에는find
를 활용할 수 있음범용성과 구현 계층도 판단 기준임. CSV 처리는 별도 도구가 적합하고, 특정 파일시스템 지원은 지나치게 특수하거나 복잡하며, 병렬 복사는 더 낮은 계층에서 해결하는 편이 나을 수 있음표준 호환성과 안전성때문에 거절한 요청도 있음.echo
의--
옵션 종료 처리는 POSIX에 어긋나고,rm --parents
처럼 트리를 거슬러 올라가는 삭제는 지나치게 위험하다고 판단함새 환경 변수와 전역 설정 파일보다는 셸 별칭, 함수, 래퍼 스크립트로 기본 동작을 바꾸는 방식을 권장함
기능을 추가하지 않는 판단
- Coreutils 개발에서
무엇을 거절할지 결정하고기여자에게 적절한 근거를 제공하는 일은 가장 어려운 작업 중 하나임 - 아래 요청들은 좋은 아이디어였지만 각기 다른 이유로 채택되지 않았으며, 연결된
메일링 리스트 논의에서 구체적인 판단 근거를 확인할 수 있음
cat: 출력 가공과 입출력 제어
cat --timestamp
: 타임스탬프 추가는awk
나perl
로 충분함cat -n
의 대체 형식: 기존 도구로 출력을 가공하는 편이 더 적합함cat --show-ends
: 행 끝 공백 강조에는grep --color
가 더 적합하거나 충분함cat --header
: 파일별 이름 출력은tail -n+1
이 이미 지원함cat -S
: 공백 문자만 있는 행을 압축하는 작업은sed 's/^ *$//' | cat -s
같은 조합으로 충분함cat -d,--direct
: 직접 입출력에는dd
의nocache
/direct
옵션이나 범용 nocache 래퍼를 사용할 수 있음
chmod: 권한 설정 범위와 표현
- 권한이 바뀌지 않으면 ctime 유지: 제안된 패치는 비효율적이라고 판단함
- 디렉터리만 대상으로 하는
권한 변경은 기존 기능으로 충분함chmod --parents
: 간단한 스크립트나find
로 충분함chmod --umask
: 기존chmod
옵션으로 충분함chmod b10111
: 이진수 변환은bash
나ksh
에서 쉽게 수행할 수 있음- 모든 사용자가 쓸 수 있는 파일 생성 금지: 범용적으로 적용할 수 없고 쉽게 우회할 수도 있음
cp: 복사 기능의 범위
cp
와mv
의옵션 및 출력 확장요청도 기존 기능과 중복되거나 필요성이 부족했음--to
:--target
보다 낫더라도 같은 일을 하는 두 가지 방법을 둘 필요는 없다고 판단함--verbose
의 유니코드 기호:ls
의 UTF-8 화살표와 같은 이유로 거절함--verbose
의 구별 기호: 문맥에서 충분한 정보를 얻을 수 있음--progress
: 기존 도구가 이미 지원함--bwlimit
: 전송 속도 제한은 상위 수준 도구에 더 적합하며rsync
에 이미 있음
cp --reflink-range=src_offset,src_length,dst_offset
: 추가할 필요성이 충분하지 않다고 판단함cp --quiet
: ENOENT 오류를 억제하려면 존재하는 파일을 먼저 걸러낼 수 있음cp --resume
:rsync
사용을 권장함cp --parallel
: 일부 상황에서 복사 속도가 빨라지지만, 더 낮은 계층에서 해결하는 편이 나을 것으로 판단함cp --preserve=all
로 ext2 확장 속성 복사:copyfile()
처럼파일시스템에 독립적인 인터페이스가 필요함
cut: 구분자와 필드 처리
cut -d 'string'
: 문자열 구분자는sed 's/string/\x00/g' | cut -d ''
로 처리하면 충분함cut --output-delimiter
의 짧은 옵션: 이미cut --ou
로 줄여 쓸 수 있음cut --csv
: CSV 처리는 복잡하므로 별도 유틸리티가 가장 적합함cut -C
:--complement
를--co
로 쓸 수 있어 별칭이 필요하지 않음cut -f2,1
: 필드 순서 변경은awk
나join
으로 충분함cut --separator
: 행 구분자 지정은tr
을 이용한 전처리/후처리로 충분함
date: 형식과 상대 날짜
date +%f
: 출력 플러시는stdbuf -oL date ...
로 충분함DAY MONTH, YEAR
형식 해석: 해당 형식은 잘못된 날짜 표기라고 판단함date +%J
: 천문학적 율리우스일은 지원할 만큼 흔한 용도가 아니라고 판단함date -v
: BSD 방식의 상대 날짜 조정 대신 기존 GNU 구문으로 충분함
dd: 속도 제한과 특수 입출력
입출력 속도 제한은 별도 도구에 맡기는 편이 적합함dd
처리량 제한:pv
,rsync
등이 더 적합함dd --limit-speed
:pv
나trickle
같은 도구에 맡기는 편이 낫다고 판단함
dd conv=noerror
를 쓰기에도 적용: 해당 용도에는shred
가 가장 적합함dd iflag=seekable oflag=seekable
:lseek(2)
지원 확인 기능은 유용성이나 완성도가 충분하지 않다고 판단함dd conv=offload
: 여러 백엔드로 복사를 위임하는 기능은 명시적으로 지원하기에 지나치게 특수함dd conv=truncpost
: 파일을 제자리에서 필터링하는 기능은 오류 처리 문제 때문에 충분히 유용하지 않다고 판단함
df와 du: 용량 표시와 정렬
df
의출력 단위 및 형식확장은 기존 옵션으로 충분하거나 추가 필요성이 낮았음df,du -g
: 기가바이트 출력 형식 지정은 표준도 아니고 필수도 아님df
자동 단위 조정:df -h
로 충분함df -g
: 출력 단위마다 별도 옵션을 두는 방식은 피하는 편이 좋음df --without-header
:--header
옵션은 데이터를 소비하는 명령에서 주로 유용하다고 판단함
df --dereference
: 별도 옵션 대신 심볼릭 링크 대상을 항상 참조하도록df
를 변경함du
의정렬은sort
와 조합할 수 있음du --format
: 정렬 목적의 형식 변경은sort -h
로 해결 가능함du --sort
:du -h | sort -h
로 이미 처리할 수 있음
- OCFS2 reflink 파일의 정확한 사용량 계산:
du
에 넣기에는 지나치게 복잡하고 특수함 du --exclude-dirs
: 디렉터리 자체를 사용량에서 제외하는 작업은find .. | du
로 충분함
join: 결합 범위와 병렬 처리
join
출력 형식 자동 감지: 유용한지 추가 검토가 필요함- 두 개를 초과하는 파일 결합: 복잡성은 늘어나지만 확장성은 확보하지 못함
- 여러 필드로 결합: 관심이 많지 않았음
comm,join --parallel
: 데이터를 나눠 여러 프로세스로 처리하는 편이 낫다고 판단함join -t '\t'
:join -t $'\t'
처럼 셸에서 탭 문자를 지정하는 방식이 충분히 보편적임
ls: 표시 형식과 필터링
- 기본 인용 스타일 변경 또는 복원 요청의 세부 사항은 ls quotes에서 확인할 수 있음
ls
의 UTF-8 화살표: 대안으로 l 스크립트가 있음df/ls --blocksize={decimal,binary}
: 더 정확하더라도 과도한 기능이라고 판단함ls --sort=class
: 유형 표시자 기준 정렬의 이점이 작음ls --octal
: 8진수 권한 출력은stat
이나find
로 충분함ls --group-numbers=locale
: 천 단위 구분자는 BLOCK_SIZE나 numfmt로 충분함ls -F /
의 끝 슬래시 생략: 결과가 지나치게 일관성을 잃는다고 판단함ls --just=$filetype
: 파일 유형 제한은ls --color -lF | sed -n 's#/$##p'
처럼 분류 표시를 필터링하면 충분함ls --sort=inode
: 저수준 기능이므로find ... | sort
가 더 적합함
mv와 rm: 이동 및 삭제 동작
mv
확장은명령 조합으로 대체할 수 있음mv -p
: 대상 디렉터리는 먼저mkdir -p
로 만드는 편이 더 유용함mv --symbolic-link
:mv
와ln --relative
를 따로 쓰면 더 세밀하게 제어할 수 있음mv --safe
: 완료 후에만 원본을 지우는 작업은cp ... && rm
으로 충분함mv --parents
: 디렉터리 계층 재생성은cp -l --parents
로 충분함
rm
의안전성 및 표준 동작변경에는 제약이 있음rm --parents
: 트리를 거슬러 올라가며 삭제하는 방식은 지나치게 위험함rm -d
:rmdir
가 같은 기능을 제공하고 혼동도 적음rm --no-preserve-root
에 보호용 확인 추가: 보안을 크게 개선하지 못함rm
이remove()
를 사용하도록 변경:unlink()
를unlink
명령에만 맡기도록 표준화된 기능을 바꿀 수는 없음
- 현재 디렉터리와 그 안의 파일 삭제는 기존 방식으로 충분함
rm -rf .
로 현재 디렉터리 삭제:rm -rf "$PWD"
를 사용할 수 있음rm -rf .
로 내부 파일 전체 삭제:rm -rf * .[!.] .??*
또는find . -delete
로 충분함
rm -s
: 더 “똑똑한” 삭제는rm -I
나find | xargs rm
으로 충분함rm --exclude
: 특정 파일명 제외는find(1)
같은 기존 도구로 충분함
shred: 재귀 처리
shred --recursive
:find
등으로 대상을 명시적으로 선택하는 편이 나음shred -r
: 파일에 대한shred
의 유용성 자체가 제한적임
sort: 정렬 기준과 실행 설정
sort --by-length
: 대신 info 문서에 행 길이로 정렬하는 예제를 추가함min
,max
명령: 채택하지 않았지만 대안인sort --range={}
는 유용해 보인다고 판단함sort -V
가 공백을 자동 무시:-b
로 더 일반적으로 처리할 수 있음sort -I
: IP 주소 정렬 기능을 추가할 필요가 있는지는 논쟁의 여지가 있음SORT_BUFFER_SIZE=1234 sort
: 환경 변수는 여러 명령이 공유할 때 유용할 수 있지만 가능한 한 피하는 편이 좋음- 기본 임시 디렉터리를
/var/tmp
로 변경: 임시 파일이 상태를 보존하지 않으므로/tmp
를 유지하는 편이 낫다고 판단함 - 고정 너비 필드 정렬:
sort -d$'\n' -k1.5,1.9 ...
로 이미 지원함 sort --header
: 앞부분의 행을 정렬에서 제외하는 작업은sed
,head
등으로 충분함
stat과 체크섬 도구
stat
의정보 조회 및 출력 확장은 기존 인터페이스와 도구 조합을 우선함stat --list-fstypes
: 내부적으로 지원하는 파일시스템 ID는 노출하지 않는 편이 나음stat --files0-from=FILE
: 모든 인자를 한 번의 호출에서 처리해야 하는 명령에만 필요함stat --digest-type=WORD
: 기존 체크섬 도구를 사용하고 파일명 등은 별도로 결합하는 편이 나음stat --quoting-style=WORD
:--format='%N'
을 조정하는 편이 더 적합함
md5sum --threads
와 후속 병렬 처리 요청: UNIX 도구만으로도 서로 다른 파일을 병렬 처리할 수 있음md5sum --base32
: Internet Archive에 특화된 기능으로 관심이 적었음md5sum
버퍼 크기 설정: 네트워크 지연을 줄이려면 NFS 매개변수를, 범용 버퍼링 제어에는stdbuf
를 쓰는 편이 나음*sum --ignore-dirs
: 사용 사례가 지나치게 제한적임md5sum --pipe
: 체크섬은 파일에, 데이터는 표준 출력에 보내는 작업은tee
로 충분함*sum --color
: 비교를 돕는 색상 표시는 별도 도구로 처리하는 편이 더 유연함*sum --no-filename
: 체크섬만 남기는 작업은 출력 후처리로 충분함
touch, uniq, wc: 기존 기능과 필터 활용
touch
의 추가 동작은기존 셸 도구로 처리할 수 있거나 이점이 부족함touch -R
:find . -exec touch -am {} +
가 더 범용적임touch --mode
: 이점이 충분하지 않음touch --verbose
: 견고하게 구현할 수 없으며xargs --verbose
나(set -x; touch *)
로도 충분함touch --create
: 파일 생성만 하려면test -e file || touch file
로 충분함
uniq
의 비교 및 집계 확장은복잡성이나 범용성때문에 채택되지 않음uniq --unsorted
:sort
가 이미 가진 많은 복잡성을 추가하게 됨uniq --ignore-last-fields
:rev | uniq -f | rev
로 충분함uniq --acumulate
: 값 합산은 Coreutils에 넣기에는 지나치게 특수하며 다른 도구에 이미 있음uniq --check-fields=N
: N개 필드만 비교하는 기능보다uniq --key
가 더 범용적인 해결책임uniq -c --total
:awk '{t+=$1}END{print t,"total"}1'
에 파이프로 전달하면 충분함uniq --regex
: 기존 도구를 DSU 패턴으로 조합하는 방식이 더 범용적임
wc
의 요청은 전처리나 입력 방식 변경으로 대체할 수 있음wc --tab-width
:expand
전처리가 더 유용함wc -q
: 파일명을 숨기려면 파일을 표준 입력으로 리디렉션하면 충분함wc --max-chars=N
: 긴 행 제거에는awk 'length($0) <= 3'
같은 기존 필터가 더 적합함
기타 요청: 옵션, 텍스트 처리, 파일 생성
tr -0
:tr
구문을 조금 더 쓰면 같은 일을 할 수 있음- 명령별
--at
옵션: 셸에 필요한 기능이 아니라고 판단함 command --examples
: 먼저GNU Coding Standards에서 채택해야 함sleep --random
: 기존 도구로 충분함chown,cpio
의user:
축약 제거: 유용한 기능이므로 유지함- 임시 FIFO 생성 요청은 채택하지 않음
mktemp -tp
: 임시 FIFO를 직접 만드는 대신 임시 디렉터리 안에 FIFO를 만드는 편이 나음mktemp --fifo
: 추가할 필요성이 충분하지 않음
hostname -b
: 기본 호스트명 설정은 플랫폼 의존성이 지나치게 큼truncate -s +50%
: 백분율 계산은truncate
밖에서 처리하는 편이 나음- 줄 바꿈과 들여쓰기 확장은
기존 텍스트 도구로 충분함fold --indent
:fmt -t | sed 's/^ / /'
로 충분함fold --prefix
: 각 행에 접두사를 붙이는 작업은fmt
나sed
로 충분함pr --fold
:pr
처리 전에fold
나fmt
로 줄을 나눌 수 있음
- 사용자와 그룹 출력 요청에는 인터페이스 또는 기존 옵션의 제약이 있음
users --all
: 로그인하지 않은 사용자까지 표시하기에는 시스템 인터페이스가 충분히 범용적이지 않음users -h
: 도움말은--h
또는--help
로 충분함groups -0
: 공백 등이 있는 그룹명을 지원하기 위해 더 표준적인id -Gnz
를 대신 제공함
BLOCK_SIZE={binary,decimal}
: 사람이 읽기 쉬운 수치에iB
와B
접미사를 붙이는 역할은 numfmt가 수행할 수 있음test -ed
: 셸 함수에서stat
을 사용하면 충분함tac -z
:tac -s $'\0'
와 동등함
기타 요청: 디렉터리, 시스템 정보, 경로
- 디렉터리 권한 및 실행 환경 관련 기능도 별도 도구나 기존 설정을 우선함
mkdir --reference
: 권한 복사는 umask와 ACL로 충분함mkdir -m ... --parents-mode
: 생성하는 모든 디렉터리에 모드를 적용하는 요청은 채택되지 않음chroot --before
: chroot 밖에서 UID를 결정하는 기능은 포함하기에 다소 특수함
- 시스템 정보 조회는
기존 명령과 시스템 호출을 활용함uname --distro
:lsb_release --id
로 충분함uname -i
,-p
의 하드웨어 정보 추론: 시스템 호출이 제공하는 정보만 사용하는 편이 낫다고 판단함
split --balanced
: 마지막 두 묶음의 행 수 균형은split -nl/$num
이 더 잘 지원함rmdir -r
:rm -r
로 충분함rmdir --one-file-system
: 이런 예외적 사례에는rm
이나find
가 더 적합함realpath -t -b
: 기존 긴 옵션에 짧은 옵션을 추가하는 것은 적절하지 않다고 판단함readlink -f
출력의 끝 슬래시: 필요하면 셸에서/
를 쉽게 추가할 수 있음
기타 요청: 자동 처리와 스트림 제어
- 탭 위치 자동 결정은 기존 기능 대비 효용이나 범용성이 부족함
expand --auto-tabs
:--tabs
를 지정하는 것보다 이점이 크지 않음expand --auto
: 동작이 충분히 범용적이지 않음
seq --format
의 일반printf
형식 지원: 접두사 추가 등은seq
밖에서 처리하는 편이 나음head --read-all-input
:tee
에 제어 기능을 추가하는 편이 더 범용적인 해결책임echo -- -e
: 일반적인--
옵션 종료 처리는POSIX 위반이며, 대신printf
를 사용할 수 있음- 파일 분할 요청은 기존 명령 조합으로 대체할 수 있거나 지원하기에 지나치게 특수하다고 판단함
csplit '@1'
: 첫 번째 필드가 바뀔 때 분할하는 기능은uniq --group
과csplit --suppress-matched
의 파이프 조합이 더 적합함cplit --output=N
: N번째 파일만 출력하는 기능은 지원하기에 지나치게 특수함
ln --absolute
: 절대 경로는realpath
나$PWD
로 쉽게 얻을 수 있음timeout
의TIMEOUT
환경 변수 설정: 드문 사용 사례이며env
등으로 변수를 명시적으로 설정하면 됨yes -n
: 개행 없는 출력은yes whatever | tr -d '\n'
로 충분함
환경 변수와 전역 설정
새 환경 변수추가는 권장하지 않으며, 셸 래퍼 스크립트와 별칭을 선호함- 관련 사례로 $LS_ARGS, $SORT_BUFFER_SIZE, $HUMAN_B, rm이 있음
-
유사한 사례로 $GREP_OPTIONS와 $GZIP이 있음
-
전역 설정 파일
/etc/gnu.conf
: Coreutils 프로그램의 기본 동작 변경에는별칭, 셸 함수, 래퍼 스크립트를 권장함
새 명령 추가 요청
- 경로 조작 명령: 기존 도구의 기능이 충분히 풍부함
sparse
:cp
가 이미 희소 파일 생성을 지원함getlimits
: 특정 프로젝트 밖에서는 충분히 표준적이지 않음quoted-printable
:recode
나perl
로 쉽게 디코딩할 수 있음errno
유틸리티:strerror()
를 감싸는 완전한 C 래퍼는 과도하며, 스크립트를contrib/
에 추가할 가능성은 열어 둠where am i
:hostname; pwd
로 충분함tableize
: 새 명령보다column -t
의--border
옵션으로 구현하는 편이 나음physmem
: 메모리 정보를 출력하는hwloc-info
,free
가 이미 있음0
,1
유틸리티: 셸 구문에 이점이 없다고 판단함cksum -a algo1 algo2
: NetBSD처럼 한 번 읽어서 여러 체크섬을 계산하기보다 별도 프로세스를 사용하는 편이 더 범용적임- util-linux의
rename
: 기존 명령이 있으며 Coreutils에 포함하도록 조정하면 변경이 지나치게 많아질 것으로 판단함 testline
: 블룸 필터 기능을 별도 명령으로 노출하기보다 기존 도구의 옵션으로 제공하는 편이 더 적합함
AI 자동 생성 콘텐츠
본 콘텐츠는 GeekNews의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기