왜`sort <“$ f1”`가`sort —“$ f1”`보다 선호되고 왜 이것이`sort“$ f1”`보다 선호됩니까?


29

에서 https://unix.stackexchange.com/a/458074/674

-- 명령에 임의의 인수를 전달할 때 사용하십시오 (또는 가능한 경우 방향 재 지정 사용). 그래서 sort -- "$f1"이상 sort < "$f1"대신 sort "$f1".

사용 --및 리디렉션 이 선호되는 이유는 무엇 입니까?

sort < "$f1"선호 sort -- "$f1"하는가?

sort -- "$f1"선호 sort "$f1"하는가?

감사.


답변:


55
sort "$f1"

$f1시작 -하거나 sort일부로 시작 하는 경우 +( -o/etc/passwd예를 들어 파일에 심각한 결과를 초래할 수 있는 경우) 또는 여기서 시작하는 값에 실패합니다 .

sort -- "$f1"

( -- 옵션의 끝을 알리는)은 이러한 문제의 대부분을 해결하지만 여전히 stdin을 의미 -하는 sort것으로 불리는 파일에 대해서는 실패합니다 .

sort < "$f1"

그런 문제가 없습니다.

여기가 파일을 여는 셸입니다. 또한 파일을 열 수 없으면 잠재적으로 더 유용한 오류 메시지가 표시됩니다 (예 : 대부분의 셸은 스크립트에 줄 번호를 표시 함). 가능한 경우 파일을 열 때 리디렉션

그리고

sort < "$f1" > out

(와 반대로 sort -- "$f1" > out) "$f1"열 수 없으면 out생성 / 잘라내 sort거나 실행되지 않습니다.

혼동 가능성을 없애기 위해 (아래 설명에 따름), 파일 자체 mmap()를 검색 할 수있는 경우 명령 이 파일을 가져 오거나 파일 lseek()내부로 들어가는 것을 방해하지 않습니다 sort. 유일한 차이점은 파일이 다른 파일 디스크립터에서 나중에 명령과 반대로 쉘이 파일 디스크립터 0에서 이전에 열린다는 것입니다. 이 명령은 원하는대로 fd 0을 탐색 / mmap 할 수 있습니다. 그것은 cat file | cmd이번에 cmdstdin이 mmaped / seeked 할 수없는 파이프 인 곳 과 혼동되어서는 안됩니다 .


4
리디렉션을 사용 sort하면 데이터를 순차적으로 읽게 mmap되어 파일 을 읽을 수 없습니다 . sort그다지 문제가되지는 않지만 less <file및 의 성능을 고려하십시오 less file. 첫 번째 경우 less에는 파일의 전체 내용을 메모리에 보관해야하며 두 번째 경우에는 원하는 부분 만 읽을 수 있습니다. 이제 상상 file... 100GB의 로그 파일
스티로폼 비행

7
@ styrofoamfly : less <file모든 파일을 메모리에 유지하는 것이 맞지만 강제하지는 않습니다. 이는 단점입니다. 만 cat file | less에 강제된다. less /dev/fd/0 <fstdin에서 파일을 수신하더라도 파일을 메모리에 보관하지 않는을 확인하십시오 . 유닉스에서 stdin을 찾을 수 없다는 것은 일반적인 오해입니다. 실제로 파일 형식에 따라 찾을 수 있습니다.
pts

@styrofoamfly 전체 파일을 한 번에 메모리로 읽는 read()동안 파일에서 데이터를 순차적으로 읽는다는 의미 mmap()입니까?
Tim

1
@JohnBollinger 아니오. GNU 프로젝트가 시작되기 전에 1980 년 SysIII에서 getopt까지 거슬러 올라 갔으며 sortPOSIX를 포함한 대부분의 표준 유틸리티를 지원해야합니다 . 그러나 항상 지원되는 것은 아닙니다.
Stéphane Chazelas

2
내 사과 @ StéphaneChazelas, 당신은 협약의 기원에 대해 옳으며, getopt()C 함수에 대한 POSIX 사양 이 인수의 중요성을 인식 한다고 더 자세하게 설명합니다 --. 그러나 요점은 당신이 받아들이는 것입니다. 인수 처리는 개별 프로그램의 영역이며 모든 것이 --특별히 다루어지는 것은 아닙니다 .
존 볼린저

17

문제는 대시로 시작하는 파일 이름입니다. 명령이 값을 옵션으로 해석하기 때문에 시작 sort "$f1"값으로 f1시작 하면 작동하지 않습니다 -. 일반적으로 오류가 발생하지만 보안 허점이 발생할 수도 있습니다 . 와 sort -- "$f1", 더블 대시 인수의 --평균 "이 시점 외의 옵션" 의 값 때문에 f1옵션으로 해석되지 않습니다. 그러나 여전히 하나의 엣지 사례가 있습니다.의 값이 f1대시이고 다른 것은 없다면 옵션이 아닙니다. -이는 "표준 입력"을 의미하는 인수입니다 (인수는 입력 파일이므로 출력 파일의 경우). "표준 출력"을 의미합니다.

리디렉션을 사용하면 이러한 함정을 모두 피할 수 있습니다.

이것은뿐만 아니라 대부분의 명령에 적용됩니다 sort.


sort < "$f1"값이 같으면 작동 한다고 말하고 -있습니까? 내가 시도한 쉘에는 없습니다.
grawity

@grawity, 비교 seq 10 > -; sort -와 함께 seq 10 > -; sort < -.
Stéphane Chazelas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.