Windows 명령 프롬프트에서 작은따옴표를 큰따옴표처럼 처리하도록 만드는 방법은 무엇입니까?

Windows 명령 프롬프트에서 작은따옴표를 큰따옴표처럼 처리하도록 만드는 방법은 무엇입니까?

내 시나리오는 간단합니다.머큐리얼 온라인 도서Windows 명령 프롬프트에 붙여넣습니다. 문제는 책의 샘플이 작은따옴표 문자열을 사용한다는 것입니다. 작은따옴표로 묶인 문자열이 Windows 명령 프롬프트에 전달되면 후자는 작은따옴표 사이의 모든 내용이 하나의 문자열에 속한다는 것을 인식하지 못합니다.

예를 들어 다음 명령은 다음과 같습니다.

hg commit -m 'Initial commit'

'Initial commit'명령 프롬프트는 두 개의 문자열 - 'Initial및 로 처리되므로 명령 프롬프트에 있는 그대로 붙여넣을 수 없습니다 commit'. 붙여넣은 후 명령을 편집해야 하는데 귀찮습니다.

작은따옴표를 큰따옴표와 유사하게 처리하도록 Windows 명령 프롬프트에 지시할 수 있습니까?

편집하다

JdeBP의 답변에 따라 나는 약간의 연구를 수행했습니다. 요약은 다음과 같습니다.

  • Mercurial 진입점은 다음과 같습니다(파이썬 프로그램입니다).

    def run():
        "run the command in sys.argv"
        sys.exit(dispatch(request(sys.argv[1:])))
    
  • 그래서 나는 mercurial에서 사용하는 명령줄 처리를 모방하기 위해 작은 Python 프로그램을 만들었습니다.

    import sys
    print sys.argv[1:]
    
  • 다음은 Unix 콘솔 로그입니다.

    [hg@Quake ~]$ python 1.py  "1 2 3"
    ['1 2 3']
    [hg@Quake ~]$ python 1.py  '1 2 3'
    ['1 2 3']
    [hg@Quake ~]$ python 1.py  1 2 3
    ['1', '2', '3']
    [hg@Quake ~]$
    
  • 다음은 해당 Windows 콘솔 로그입니다.

    C:\Work>python 1.py  "1 2 3"
    ['1 2 3']
    
    C:\Work>python 1.py  '1 2 3'
    ["'1", '2', "3'"]
    
    C:\Work>python 1.py  1 2 3
    ['1', '2', '3']
    
    C:\Work>
    

Windows에서는 작은따옴표를 큰따옴표로 처리하지 않는다는 것을 분명히 알 수 있습니다. 그리고 이것이 내 질문의 본질입니다.

답변1

command.com 프롬프트에서는 인용 문자를 변경할 수 없습니다. 그러나 작은따옴표와 큰따옴표를 모두 인용 문자로 허용하는 PowerShell을 사용할 수 있습니다. 이는 Unix 쉘에서와 동일하게 작동합니다. 즉, 작은따옴표는 변수를 확장하지 않지만 큰따옴표는 확장합니다.

따옴표 안에 따옴표가 있으면 여전히 문제가 발생할 수 있습니다. 예를 들어, Windows 컴퓨터에 딸기 Perl이 설치되어 있습니다. PowerShell을 실행하면 perl -e 'print time, "\n" '다음과 같은 출력이 표시됩니다 1321375663SCALAR(0x15731d4). 예상대로 작동하려면 큰따옴표를 이스케이프 처리해야 합니다.perl -e 'print time, \"\n\" '

답변2

첫째, 명령 프롬프트는 명령 해석기가 아닙니다. (명령 프롬프트가 중요합니다표시명령 해석기.) 둘째, 명령 해석기, 실행되는 프롬프트 및 Win32 콘솔에는전혀 아무것도이것과 관련이 있습니다.

Win32 프로그램에서 명령줄을 "단어"(C 및 C++ 언어의 프로그램에서 전달된 인수 배열로 간주하는 NUL 종료 멀티바이트 문자열)로 분할하는 것은 main()해당 프로그램의 런타임 라이브러리 영역입니다. Unices와 Linux에서 운영 체제는 실제로 인수 문자열 배열 측면에서 작동하기 때문에 쉘은 단어 분할을 수행합니다. Win32의 경우에는 그렇지 않습니다. Win32에서 운영 체제 자체는 다음과 같은 방식으로 작동합니다.명령 꼬리: ㅏ하나의원래 명령줄에 입력한 모든 따옴표가 여전히 포함되어 있는 긴 문자열입니다. (거기~이다대상 프로그램에 전달되기 전에 명령 해석기에 의해 이 명령 꼬리에 일부 처리가 수행되지만 단어 분할과는 관련이 없습니다.)

귀하의 경우 hg프로그램의 런타임 라이브러리는 다음 명령 꼬리를 전달합니다.

commit -m '초기 커밋'

해당 프로그램이 컴파일된 런타임 라이브러리는 작은따옴표가 공백 인용 문자라는 것을 의미한다는 것을 모릅니다.그건 컨벤션이 아니야. 컨벤션 거래오직큰따옴표(그리고 큰따옴표 앞의 백슬래시)로 묶습니다.

이 규칙은 처음에 프로그램을 생성하는 데 사용된 컴파일러와 함께 제공된 런타임 라이브러리에 내장되어 있습니다. 규칙을 변경하려면 다시 연결해야 합니다.이런 식으로 실행하려는 모든 개별 프로그램작은따옴표도 인식하는 사용자가 직접 만든 특별한 런타임 라이브러리가 있습니다. 분명히 이것은 비실용적입니다(모두 Cygwin 프로그램이 아닌 한).

훨씬 더 실용적인 접근 방식은 이미 하고 있는 일을 수행하는 것입니다. 즉, Windows가 Unix가 아니라는 점을 인식하고 사용하기 전에 그에 맞게 예제를 조정하는 것입니다.

답변3

나는 DOS가 명령을 구문 분석하는 방식을 편집할 수 없다고 확신합니다. 이는 기본 프로그래밍에 내재되어 있습니다.

속도를 높이기 위해 제가 생각할 수 있는 유일한 해결책은 메모장 창을 열어두고 '찾기 및 바꾸기'를 실행하는 것입니다. 즉, 모든 작은따옴표를 큰따옴표로 바꾸는 것입니다. 그런 다음 거기에서 DOS로 복사하여 붙여 넣습니다.

관련 정보