명령을 실행 file -- *
하고 다음 출력을 얻습니다.
-file04: data
-file05: data
-file06: data
-file07: ASCII text
따라서 기본적으로 파일 이름과 콘텐츠 유형을 인쇄합니다. 그런데 매개변수는 무엇을 의미하나요?
답변1
file -- *
다음은 Unix 쉘 언어용 코드입니다. 새로운 프로세스에서 명령을 찾아 실행하고, 인수와 환경 변수를 전달하고, 표준 입력/출력/오류 스트림을 검사하도록 설계된 Unix 쉘 언어입니다.
언어는 초보적이지만 몇 가지 멋진 기능을 가지고 있습니다.
예제의 이 줄간단한 명령쉘 언어 구문에서.
공백은 단어를 구분하는 데 사용됩니다. 여기 file
, --
그리고 *
.
여기서 첫 번째 단어 file
는 실행할 명령의 이름으로 처리됩니다. 쉘은 특수 변수를 사용하여 명령에 대한 경로를 찾습니다 $PATH
. 나는 이럴 수도 있다 /usr/bin/file
.
이 *
단어에는 쉘 와일드카드 문자( *
)가 포함되어 있으므로 다음과 같은 쉘의 특수 기능을 트리거합니다.파일 이름 생성또는와일드카드(POSIX에서는 이것을 호출합니다.경로명 확장). 쉘은 *
패턴과 일치하는 파일 이름 목록으로 대체됩니다 . *
임의 개수의 문자와 일치하는 패턴입니다. 따라서 쉘은 이를 알파벳순으로 정렬된 현재 디렉토리의 모든 파일 이름(숨겨진 파일 제외)으로 확장합니다.
그러면 쉘은 하위 프로세스를 분기하고 해당 하위 프로세스에서 /usr/bin/file
, file
및 --
파일 이름 목록(귀하의 경우 -file04
, -file05
...)을 인수로 사용하여 실행합니다.
이 file
명령은 별도의 명령입니다 sh
. sh
의 임무는 명령줄을 구문 분석하는 것이고, file
의 임무는 파일 내용의 성격을 식별하는 것입니다.
대부분의 명령과 마찬가지로 일단 시작되면 file
해당 인수가 구문 분석됩니다. 첫 번째는 file
호출하는 방법과 오류 메시지에서처럼 자신을 참조하는 방법을 알려줍니다. 다음 매개변수는 수행할 작업을 알려줍니다.
대부분의 명령과 마찬가지로 다음으로 시작하는 인수는 -
옵션으로 간주됩니다. 여기서 첫 번째 매개변수는 입니다 --
. 기술적으로는 옵션이 아니라 옵션 닫는 태그입니다. file
지금부터 옵션 처리를 중지해야 하며 다음 인수가 로 시작하더라도 옵션으로 처리되어서는 안 된다는 것을 알려줍니다 -
.
-file01
다음 매개변수는 실제로 옵션으로 처리되기보다는 file
내용의 성격을 알려주는 파일 이름 이기 때문에 이는 좋은 것입니다 .
(일부 명령에서 문제가 될 수도 있음)로 시작하는 옵션이 아닌 인수를 전달할 때 --
또는 /로 시작할 수 있는 인수가 일부 확장의 결과인 경우(예: , , ... hour 사용) 이 작업을 수행해야 합니다.-
+
-
+
cmd -- "$arg"
cmd -- *
cmd -- "${args[@]}"
cmd -- $(cmd2)
그렇지 않으면 버그 및 보안 취약점이 발생할 수 있습니다.
파일 경로를 의미하는 매개변수의 경우, 또 다른 접근 방식은 /
( 로 시작하지 않는 매개변수의 접두사를 붙이는 것입니다. 이는 동일한 파일에 대한 경로이지만 후자만 옵션으로 사용할 수 있습니다. 이 방법을 사용하는 것은 종료 마커를 옵션으로 지원하지 않는 명령에 필요할 수 있으며, 을 처리한 후에도 호출 파일이 아닌 표준 입력만을 의미하는 것으로 해석되거나 포함된 매개변수가 전달되는 등의 다른 문제를 해결할 수도 있습니다../
./-foo/bar
-foo/bar
--
-
-
--
awk
=
답변2
대부분의 GNU 콘솔 유틸리티는 대시를 전달하지 않는 한 대시로 시작하는 파일을 처리할 수 없습니다 --
.
$ cat -file1
생산하다
cat: invalid option -- 'f'
Try 'cat --help' for more information.
그렇기 때문에 유틸리티에 옵션 처리를 중지하고 나머지 매개변수를 파일로 처리하도록 지시하므로 귀하의 경우에 --
필요한 것입니다 .file
이 기능이 실행 가능한 옵션처럼 보이기 때문에 어떤 방식으로든 활용할 수 있는지 궁금합니다. 누군가에게 파일(예: tar 아카이브)을 보내고 무언가를 하도록 요청합니다(예 command *
: 대시로 시작하는 파일은 대부분의 사람들이 수행하지 않는 실사를 수행하지 않는 한 옵션으로 해석됩니다. 예를 들어 --
대시로 시작하는 파일이 하나도 없어서 마지막으로 언제 사용했는지 기억이 나지 않습니다 .