다른 답변 / 의견에서 알 수 있듯이 명령 뒤에 공백이 있어야한다는 생각은 정확하지 않습니다. 잘 알려진 예는 먼저 공백이 없어도 명령 뒤에 슬래시를 입력 할 수 있다는 것입니다.
그러나 조금 덜 이해되는 또 다른 동작이 있으며 cd..
사용자가 요구 하는 " "을 허용합니다 . 이 동작을 통해 " cd\
"도 작동합니다.
설명하는 동작은 명령 줄 인터프리터 내부의 모든 명령과 일치합니다. 마침표, 슬래시 또는 백 슬래시를 포함하여 특정 기호가있는 경우 이전 문자를 검사하여 "명령 줄 인터프리터"셸 (CMD.EXE 또는 이전 COMMAND.COM 내부 명령)인지 확인합니다. ).
이것은 단어가 파일 또는 서브 디렉토리를 참조 할 수 있는지 확인하기 전에 수행 될 수 있습니다. 그것은 cd
명령에 해당됩니다. 비극적으로 샘플을 만들 때 이것이 copy
명령에서 발생하지 않는다는 것을 알았 으므로 결과가 일치하지 않습니다. 모든 내부 명령과 반드시 같은 것은 아닙니다. 다른 명령 줄 del
과를 비교하기 위해 검색을 계속하지 않았 dir
으므로 공백없이 발생하는 일에 의존하려고하면 매우 신중하게 제안하는 것이 좋습니다.
echo 명령 에 대한 질문도 있었습니다. 이것은 예외적 인 예외 echo.
입니다. DOS 전문가들에게는 꽤 잘 알려진 것 같습니다. 이것은 아마도 문서화되었습니다. 적어도 Win7의 CMD 에서 동작 은 명령이 " echo.
"로 시작 하면 첫 번째 기간이 무시되는 것입니다. 따라서 " echo..hi
"는 " "의 출력으로 바뀝니다 .hi
. " echo.
"를 사용하여 빈 줄을 인쇄 할 수 있습니다. 반대로 유닉스에서는 단순히 " echo
"명령 만 실행하면 됩니다. 그러나 DOS에서는 " echo
"명령 만 실행 하면 현재 " echo "설정 이 출력됩니다 . 마찬가지로 DOS는 " Echo *Off*
"와 "Echo *On*
"를 현재 에코 설정을 변경하는 특수 값으로 사용합니다. 실제로" Off
" 단어를 인쇄하려면" " Echo.Off
(최소한 최신 버전의 Microsoft CMD 명령 줄 인터프리터를 사용하여)를 사용하십시오.
따라서 적어도 echo
명령에는 반 합리적인 설명이 있습니다. 나머지 명령은 내부 명령이 우선이라고 생각했습니다. 그러나 몇 가지 테스트를 시도했을 때 실제로 일관성이 없다는 것을 알았습니다. 나는 여기에 문서화 한 몇 가지 예를 통해 이것을 보여줍니다.
여기 몇 가지 예가 있어요. UAC가 루트 디렉토리에 쓰는 것에 대해 신경 쓰지 않도록 관리자 권한 명령 프롬프트를 사용했습니다. 이것은 Microsoft Windows 7의 CMD.EXE로 수행되었습니다. 이전 MS-DOS 버전의 COMMAND.COM 또는 다른 회사에서 출시 한 소프트웨어 (DR-DOS의 COMMAND.COM)와 같은 다른 버전에서는 동작이 다를 수 있습니다.
(이 답변은 이미 오래 걸리기 때문에 파일 시스템에서 만든 모든 혼란을 정리하는 명령이 포함되어 있지 않습니다. 약간의 정리가 있지만 많지는 않습니다.)
다음은 내부 명령이 우선 순위를 작성 함을 증명하는 예입니다. (또한 이중 콜론을 사용하여 주석으로 효과적으로 사용할 수있는 약간의 알려진 능력을 보여줍니다. 이는 배치 파일에서도 잘 작동합니다. 기술적으로 배치 파일에서는 GOTO에서 도달 할 수없는 레이블로 처리되어 끝납니다. REM 명령보다 빠릅니다.)
C : \ something> md cd
C : \ something> echo echo subdir >> cd \ a.bat
C : \ something> md \ a
C : \ something> . \ cd \ a.bat 하위
디렉토리
C : \ something> :: 즉, 서브 디렉토리에서 실행
C : \ 뭔가> \ CD
C : \ A> :: 내 현재 디렉토리를 변경, 그래서 CD가 우선 순위를했다
업데이트 : 추가 실험을 통해 지정된 디렉토리에 마침표가 포함되어 있지 않으면 내부 cd 명령이 파일 시스템보다 우선합니다. 따라서 " a.bat " 라는 디렉토리가 있으면 " **cd\a.bat**
"를 실행 하면 배치 파일이 실행됩니다.
덜 일반적인 행동에 대한 탐구는 (대부분의 디렉토리에 기간이 없기 때문에) 찾은 결과를 업데이트했습니다. cd 명령은 실제로 처음에 생각했던 것보다 copy 명령 과 더 유사하게 작동하는 것으로 나타났습니다 .
처음에는 cd 및 copy 명령이 다르게 작동 한다고 생각했지만 이제는 제공 한 이름의 패턴 때문인 것으로 나타났습니다. 그래도 이전 결과를 검토 한 결과 이전에 문서화 된 테스트를 통해 이름에 마침표와 확장명이 포함 된 경우와 그렇지 않은 경우의 차이를 보여주는 데 도움이된다고 판단했습니다. 그래서, 나는 여전히 오래된 결과를 아래에 포함하고 있습니다 (대부분 변경되지 않았지만 아주 작은 업데이트로 말한 것이 정확합니다).
다음은 확장명이 사용되지 않을 때 전체 경로를 가진 copy 가 cd 와 동일한 우선 순위를 사용하지 않음을 보여주는 예제 입니다.
C : \ something> echo echo root >> \ try.bat
C : \ something> md copy
C : \ something> echo echo 하위 디렉토리 >> copy \ try.bat
C : \ something> . \ copy \ try.bat는 다음 위치에서 실행됩니다. 서브
디렉토리 서브 디렉토리
C : \ something> copy \ try.bat
서브 디렉토리
C : \ something> :: 응? 왜 루트에서 재정의하고 실행하지 않았습니까?
C : \ something> :: 내부 복사 명령이 하위 디렉토리 및 전체 파일 이름 확인보다 우선 순위가 높지 않았습니다 ( 디렉토리가없는 경우 내부 cd 명령 이 우선 순위를 갖더라도 )
: C : \ something> ::
C : \ something>:: 다른 테스트 :
C : \ something> . \ copy .. \ try.bat
하위 디렉토리
C : \ something> 끝에 쓸모없는 기간을 추가 할 수 있습니다 . :: 좋습니다. 그러나 이것은 하위 디렉토리를 확인하지 않습니다.
C : \ something> copy .. \ try.bat
1 개의 파일이 복사되었습니다.
C : \ something> :: 내부 복사 명령을 실행했습니다.
필자의 초기 연구 결과에 따르면 이러한 결과는 명령 줄 셸이 우선 순위임을 나타냅니다.
- 내부 명령 이름 바로 뒤에 백 슬래시를 지정할 때 내부 복사 명령 대신 파일 시스템에
- 내부 명령 이름 바로 뒤에 백 슬래시를 지정할 때 파일 시스템 대신 내부 cd 명령을 사용하십시오.
- 내부 명령 이름 바로 뒤에 마침표를 지정할 때 파일 시스템 대신 내부 복사 명령
이는 copy 명령 (확장자를 포함한 전체 파일 이름 포함)과 cd 명령 (디렉토리 이름의 일부로 확장명 없음 ) 간에 동작이 일관성이 없음을 분명히 보여줍니다 . 백 슬래시를 사용할 때 파일 이름 확장자가 전체 인 copy 명령은 먼저 파일 시스템을 검사하지만 cd 명령은 디렉토리에 확장자가없는 경우에는 그렇지 않습니다.
(업데이트 : 처음에는 불일치가 프로그램 간의 다른 동작에 기초한 것으로 생각했습니다. 나중에 불일치가 존재하지만 제공된 매개 변수로 인해 더 많이 발생했습니다.)
실제로, 내가 방금 말한 모든 개별적인 것을 보여주는 것처럼 보이지만 그 불릿 포인트조차 완전히 정확하지는 않습니다. 문제는 글 머리 기호 목록이 완전히 정확할만큼 정확하지 않다는 것입니다. (나는 그 글 머리 기호를 비교적 쉽게 비교하고 비교적 쉽게 확인할 수 있도록 물건을 부정확하게 남겨 두었습니다.)
그러나보다 정확하게하기 위해 첫 번째 글 머리 기호는 명령 행 쉘이 우선 순위를 부여한다는 점을 지적해야합니다.
- 내부 명령 이름 바로 뒤에 백 슬래시 를 지정한 다음 전체 경로의 나머지 부분을 지정할 때 파일 시스템 (내부 복사 명령 대신 )
다음은 내가 왜 그 차이점을 만들고 있는지 보여줍니다.
C : \ elsewhere> 이 선에 필요한 echo UAC 고도 >> \ needext
C : \ elsewhere> 이 선에 필요한 echo UAC 고도 >> \ needext.bat
C : \ elsewhere> md. \ copy
C : \ elsewhere> echo @ Echo subdir >> copy \ needext.bat
C : \ elsewhere> . \ copy \ needext
subdir
C : \ elsewhere> copy \ needext.bat
subdir
C : \ elsewhere> copy \ needext
1 파일이 복사되었습니다.
C : \ elsewhere> :: UAC는 다음 줄에도 필요했습니다.
C : \ elsewhere> del \ needext
C : \ elsewhere> del \ needext.bat
(마지막 복사 명령은 내부 복사 명령이 사용 되었기 때문에 \ needext 라는 파일을 찾았습니다 . \ needext.bat 파일 은 copy 라는 단어가 포함 된 명령 행에서 절대 사용하지 않았 음을 쉽게 보여주기 위해 작성되었습니다. .)
이 시점에서 백 슬래시를 사용할 때 ( 복사 명령 의 동작과 함께) 일부 불일치를 설정했습니다 .
다음으로 이러한 명령간에 일관성이 있음을 보여 드리겠습니다. (따라서 일관성이 있습니다. 음 .. 때때로. 일관성이 없을 수도 있습니다.) 다음에 보여줄 것은 마침표를 사용할 때 cd 명령이 복사 명령 처럼 작동한다는 것 입니다. 복사 명령은 내부 명령을 사용하여, 그래서 않습니다 CD의 명령을 사용합니다.
C : \ something> md. \ yetmore
C : \ something> cd. \ yetmore
C : \ something \ yetmore> md. \ md
C : \ something \ yetmore> echo echo subdir >> md \ test.bat
C : \ something \ yetmore> \ MD \ 테스트..
서브 디렉토리
C : \ 뭔가 \ yetmore> MD \ 테스트.
C : \ 뭔가 \ yetmore> . MD \ 테스트
하위 디렉토리 나 파일을 \ 테스트가 이미 존재합니다..
C : \ something \ yetmore> ::이 오류는 내부 명령을 실행했음을 나타냅니다.
C : \ something \ yetmore> md .. \ test
C : \ something \ yetmore> md. \ cd
C : \ something \ yetmore> copy. \ md cd
. \ md \ test.bat
1 개의 파일이 복사되었습니다.
C : \ something \ yetmore> . \ cd. \ test
하위 디렉토리
C : \ something \ yetmore> cd. \ test
C : \ something \ yetmore \ test> :: 내부 명령이 한 기간 동안 작동했습니다
. C : \ something \ yetmore \ test> cd ..
C : \ something \ yetmore> . \ cd .. \ test
하위 디렉토리
C : \ something \ yetmore> cd .. \ test
C : \ something \ test> :: 두 개의 기간이있을 때 내부 명령도 우선 순위를 가짐 익숙한
그래서, 대부분에 초점을 맞춘 초기 테스트 세션 동안 CD 및 복사 (일부 추가 사용하여 명령을 MD 와 약간의 델 , 우리가 정말 파일 시스템보다 우선이 함께했다 있었다 유일한 시간) 복사 한 후 명령하고, 파일 시스템은 전체 경로를 사용할 때만 우선권을 가졌습니다.
후속 검토 후, cd 명령은 확장자를 사용할 때 파일 시스템에 우선 순위를 부여 한다는 것을 알았습니다 . 적어도 이것은 내부 명령이 서로보다 일관성있게 처리되고 있음을 의미합니다. 그러나 이는 파일 시스템 객체 (파일 또는 디렉토리)의 이름에 따라 다른 동작을한다는 것을 의미합니다. 그것은 행동이 실제로 모호한 내부 논리를 사용하는 것처럼 보입니다. 따라서 다른 운영 체제에서 작동하기 위해이 동작을 사용하는 것은 안전하지 않은 것으로 간주됩니다 .