`sort < "$f1" `가 `sort -- "$f1"`보다 나은 이유는 무엇이며, `sort "$f1"`보다 나은 이유는 무엇입니까?

`sort < "$f1" `가 `sort -- "$f1"`보다 나은 이유는 무엇이며, `sort "$f1"`보다 나은 이유는 무엇입니까?

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

사용하는 것을 기억하세요-- 명령에 임의의 매개변수를 전달할 때(또는 가능하면 리디렉션을 사용하십시오). 그래서 sort -- "$f1"또는 그 sort < "$f1"대신 에 더 좋습니다 sort "$f1".

먼저 사용 --하고 리디렉션하는 이유는 무엇입니까?

sort < "$f1"우선순위를 두는가 sort -- "$f1"?

sort -- "$f1"우선순위를 두는가 sort "$f1"?

감사해요.

답변1

sort "$f1"

$f1다음으로 시작하는 값 -또는 다음 sort으로 시작하는 값의 경우 실패합니다(예: +호출되는 파일에 심각한 결과가 발생할 수 있음).-o/etc/passwd

sort -- "$f1"

( -- 옵션의 끝을 의미함)은 대부분의 문제를 해결하지만 호출되는 파일 -( sort표준 입력으로 해석함)에서는 여전히 실패합니다.

sort < "$f1"

그런 문제는 없습니다.

여기서는 파일을 여는 쉘입니다. 이는 또한 파일을 열 수 없는 경우 더 도움이 될 수 있는 오류 메시지도 표시한다는 것을 의미합니다(예를 들어 대부분의 쉘은 스크립트의 줄 번호를 표시합니다). 가능한 경우 리디렉션을 사용하여 파일을 열면 .

그리고

sort < "$f1" > out

( sort -- "$f1" > out반대) "$f1"열 수 없는 경우 out생성/잘림 또는 실행조차 되지 않습니다 sort.

발생할 수 있는 혼란을 없애기 위해(아래 참고), 파일 자체가 검색 가능한 경우 명령을 mmap()파일에 넣거나 lseek()파일 내부에 넣는 것을 막지 않습니다. sort유일한 차이점은 파일이 나중에 다른 파일 설명자에 있을 수 있는 명령에 의해 열리는 것이 아니라 파일 설명자 0의 셸에 의해 더 일찍 열린다는 것입니다. 이 명령은 필요에 따라 fd 0을 찾거나 매핑할 수 있습니다. cat file | cmd이번에 cmd는 stdin이 매핑/조회할 수 없는 파이프라는 사실 과 이것을 혼동하지 마십시오 .

답변2

문제는 파일 이름이 대시로 시작한다는 것입니다. 값이 다음으로 시작하는 경우 sort "$f1"명령이 해당 값을 옵션으로 해석하므로 아무런 효과가 없습니다. 일반적으로 오류가 발생하지만 가능합니다.f1-보안 취약점을 만들다. 그리고 sort -- "$f1",이중 대시 인수는 --"다른 선택의 여지가 없습니다"를 의미합니다.따라서 해당 값은 f1옵션으로 해석되지 않습니다. 그러나 여전히 극단적인 경우가 있습니다. 값이 f1대시이고 다른 것이 없으면 옵션이 아니라 -"표준 입력"을 의미하는 매개변수입니다(매개변수는 입력 파일이므로 출력 파일의 경우 이는 다음을 의미합니다). "표준 입력" 출력").

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

이는 sort.

관련 정보