모든 명령의 매개변수 위치는 고정되어 있지 않은 것 같습니다.
예를 들어, cp -r ./abc ./def
그리고 cp ./abc ./def -r
는 동일하고, grep -rnH hello .
동일 grep hello . -rnH
합니다...
그런데 오늘 사용해 보니 ldd
제가 틀렸다는 것을 깨달았습니다. 왜냐하면 ldd -r x.so
와는 ldd x.so -r
다르기 때문입니다. 두 번째 명령에서 오류가 발생했습니다.
ldd: ./-r: No such file or directory
왜 매개변수의 위치를 변경할 수 없나요 ldd
?
답변1
일부 GNU 유틸리티는 옵션과 옵션 인수가 피연산자 앞에 오도록 명령줄 인수를 자동으로 재구성합니다. 이는 표준 동작이 아닙니다.
표준 준수 유틸리티는 옵션 및 옵션 인수가 먼저 나타날 것으로 예상하고 명령줄 구문 분석기가 옵션이 아닌 첫 번째 인수를 찾으면 나머지 인수는 피연산자로 처리됩니다.
cp -i file1 file2
위의 경우 첫 번째 매개변수는 옵션이고 마지막 두 매개변수는 피연산자입니다.
cp file1 file2 -i
위에 세 개의 피연산자가 있습니다. GNU가 아닌 구현에서는 sum을 이름이 지정된 디렉터리에 복사 cp
합니다 (그러한 디렉터리가 없으면 오류 메시지를 표시합니다). 반면 GNU는 이를 옵션으로 보고 파일이 있으면 덮어쓸 것인지 묻습니다 .file1
file2
-i
cp
-i
file2
이 동작은 환경 변수를 설정하여 수정할 수 있습니다 POSIXLY_CORRECT
.
$ cp file1 file2 -i
cp: overwrite 'file2'? n
$ POSIXLY_CORRECT=1 cp file1 file2 -i
cp: target '-i' is not a directory
아니면 당신은 --
사용할 수 있습니다분명히옵션의 끝을 표시합니다. 이는 명령이 GNU 모드에서 옵션을 구문 분석하는지 여부에 관계없이 작동합니다.
$ cp -- file1 file2 -i
cp: target '-i' is not a directory
이는 다음 사항에서 기억해야 할 사항입니다.
grep 'PATTERN' *.txt
GNU의 경우 다음과 같이 grep
작성해야 합니다.
grep -- 'PATTERN' *.txt
또는
grep -e 'PATTERN' -- *.txt
일부 파일 PATTERN
의 .txt
이름이 -
.
귀하의 시스템( GNU API를 사용하지 않고 옵션을 수동으로 구문 분석하는 스크립트 ldd
인 GNU 시스템 )은 "GNU 방식"으로 명령줄 인수를 구문 분석하지 않습니다. 이는 (IMHO) 올바르게 수행됩니다.bash
getopt_long()
GNU 문서에서 getopt_long(3)
:
기본적으로 스캔 시 옵션이 아닌 모든 항목이 끝에 오도록
getopt()
콘텐츠가 정렬됩니다 . [...] is 또는 환경 변수 의 첫 번째 문자argv
가 설정된 경우 옵션이 아닌 인수가 발견되는 즉시 옵션 처리가 중지됩니다.optstring
+
POSIXLY_CORRECT