source

"!!"가 포함된 문자열을 전달할 때 argv의 이상한 동작!"

ittop 2023. 9. 24. 13:07
반응형

"!!"가 포함된 문자열을 전달할 때 argv의 이상한 동작!"

나는 몇가지 입력 파라미터를 사용하는 작은 프로그램을 작성했습니다.*argv[]인쇄합니다.거의 모든 사용 사례에서 내 코드는 완벽하게 잘 작동합니다.문자열 끝에 하나 이상의 느낌표를 사용할 때만 문제가 발생합니다. 인수로 전달하고자 하는...

작동 내용:

./program -m "Hello, world!"

이것은 작동하지 않습니다.

./program -m "Hello, world!!!!"

^^ 이렇게 하면 프로그램 출력이 문자열의 두 배가 되거나 이전에 ./program에 입력한 명령어가 됩니다.

하지만 제가 전혀 이해할 수 없는 것은:이상하게도 다음이 효과가 있습니다.

./program -m 'Hello, world!!!!'

^^ 출력은 정확히...

Hello, world!!!!

... 뜻대로

그래서 제 질문은 다음과 같습니다.

  • 문자열에 여러 개의 느낌표를 사용할 때 이러한 이상한 동작이 발생하는 이유는 무엇입니까?
  • C에서 사용하는 것으로 알고 있습니다.""끈용으로 그리고''단차용으로그럼 사용할 때 원하는 결과가 나오는 이유는 무엇일까요?'', 사용할 때는 그렇지 않습니다.""내가 알기로는?
  • 코드에 오류가 있거나 문자열을 입력하고 정확히 해당 문자열을 인쇄하려면 무엇을 변경해야 합니까?

내 코드의 관련 부분:

// this is a simplified example that, in essence, does the same 
// as my (significantly longer) code
int main(int argc, char* argv[]) {
    char *msg = (char *)calloc(1024, sizeof(char));

    printf("%s", strcat(msg, argv[2])); // argv[1] is "-m"

    free(msg);
}

이미 의 내용을 복사해 보았습니다.argv[2]char*버퍼를 먼저 채우고 a를 추가합니다.'\0'아무것도 바꾸지 않았던 그에게 말입니다.

이것은 당신의 코드가 아니라 그것을 시작하는 셸과 관련된 것입니다.

대부분의 포탄에서!!실행된 마지막 명령의 약자입니다.큰따옴표를 사용할 경우 셸은 문자열 내에서 이력 확장(변수 대체 등과 함께)을 허용하므로 다음을 입력합니다.!!이중 quoted 문자열 안에서 마지막 명령 실행을 대체합니다.

이것이 프로그램에서 의미하는 것은 이 모든 것이 프로그램이 실행되기 전에 발생하기 때문에 전달된 문자열이 유효한지 확인하는 것 외에는 프로그램이 할 수 있는 일이 많지 않다는 것입니다.

반면, 작은 따옴표를 사용할 경우 셸은 대체 작업을 수행하지 않으며 문자열은 수정되지 않은 상태로 프로그램에 전달됩니다.

따라서 이 문자열을 전달하려면 작은 따옴표를 사용해야 합니다.사용자가 대체가 발생하지 않으려면 이 사실을 알아야 합니다.그 대안은 문자열이 전달되도록 사용자에게 메시지를 보내는 래퍼 셸 스크립트를 만드는 것입니다. 그러면 스크립트는 이후에 적절한 인수를 사용하여 프로그램을 호출합니다.

셸은 큰 따옴표가 달린 문자열로 확장합니다.Bash 매뉴얼 페이지(대부분의 Linux 배포 환경에서 기본값인 Bash를 사용한다고 가정)를 읽어보면 History Expansion 섹션을 보면!!

이전 명령을 참조합니다.

그렇게!!!!더블 quoted 문자열이 이전 명령으로 두 번 확장됩니다.

이러한 확장은 따옴표가 하나인 문자열에는 적용되지 않습니다.

따라서 문제는 프로그램 내에 있는 것이 아니라 프로그램을 호출하는 환경(쉘) 때문에 발생합니다.

제시된 답변 외에 에코는 셸 친구임을 기억해야 합니다.명령어 앞에 "echo"를 붙이면 실제로 어떤 셸이 스크립트로 전송되는지 확인할 수 있습니다.

echo ./program -m "Hello, world!!!!"

이것은 당신에게 약간의 이상함을 보여주고 당신을 올바른 방향으로 이끄는 데 도움을 주었을 것입니다.

언급URL : https://stackoverflow.com/questions/48687023/strange-behavior-of-argv-when-passing-string-containing

반응형