명령 매개변수의 위치

명령 매개변수의 위치

모든 명령의 매개변수 위치는 고정되어 있지 않은 것 같습니다.

예를 들어, 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는 이를 옵션으로 보고 파일이 있으면 덮어쓸 것인지 묻습니다 .file1file2-icp-ifile2

이 동작은 환경 변수를 설정하여 수정할 수 있습니다 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) 올바르게 수행됩니다.bashgetopt_long()


GNU 문서에서 getopt_long(3):

기본적으로 스캔 시 옵션이 아닌 모든 항목이 끝에 오도록 getopt()콘텐츠가 정렬됩니다 . [...] is 또는 환경 변수 의 첫 번째 문자 argv가 설정된 경우 옵션이 아닌 인수가 발견되는 즉시 옵션 처리가 중지됩니다.optstring+POSIXLY_CORRECT

관련 정보