~에서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
.