Windows 명령 줄에서“cd ..”가 작동하는 이유는 무엇입니까?


86

입력 할 때 cd..사이에 공백없이 cd..Windows 명령 프롬프트 행복하게 상위 폴더로 전환됩니다. 이 행동에 대한 설명이 있습니까? 이 명령은 표준 형식을 따르지 않습니다.command<space>arguments

작동하지만 안됩니까?

또한 왜 이것이 일관된 결과를 얻지 못합니까?

에코..


24
귀하의 질문의 전제가 깨져있는 것 같습니다. 이것이 구문 상 잘못되었다는 귀하의 주장에 대한 증거를 제공 할 수 있습니까?
궤도에서 가벼움 레이스

13
"command <space> arguments"가 cmd (또는 그 선행 작업) 의 표준 형식 이라고 생각하지 않습니다 . 예를 들어 dir/a또는 유사한 VMS 구문을 고려하십시오 .
grawity

6
cd는 매우 특별합니다. 당신은 cd c:\program files따옴표없이 입력 할 수 있으며 여전히 작동합니다
phuclv

20
다음은 Windows 셸 로직의 단점과 그 원인이 무엇인지 설명하는 매우 재미있는 기사입니다. thedailywtf.com/articles/The-Core-Launcher
vsz

3
cd..작동합니까? Microsoft가 명시 적으로 작동하는 데 어려움을 겪었 기 때문입니다. cd는 Windows의 명령 인터프리터에 내장 된 명령이며 Microsoft는 원하는대로 인터프리터를 수행 할 수 있습니다. (또 다른 예로, cd이름에 공백이있는 디렉토리를 인용 할 필요도 없습니다.)
jamesdlin

답변:


106

다른 답변 / 의견에서 알 수 있듯이 명령 뒤에 공백이 있어야한다는 생각은 정확하지 않습니다. 잘 알려진 예는 먼저 공백이 없어도 명령 뒤에 슬래시를 입력 할 수 있다는 것입니다.

그러나 조금 덜 이해되는 또 다른 동작이 있으며 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 명령 과 더 유사하게 작동하는 것으로 나타났습니다 .

처음에는 cdcopy 명령이 다르게 작동 한다고 생각했지만 이제는 제공 한 이름의 패턴 때문인 것으로 나타났습니다. 그래도 이전 결과를 검토 한 결과 이전에 문서화 된 테스트를 통해 이름에 마침표와 확장명이 포함 된 경우와 그렇지 않은 경우의 차이를 보여주는 데 도움이된다고 판단했습니다. 그래서, 나는 여전히 오래된 결과를 아래에 포함하고 있습니다 (대부분 변경되지 않았지만 아주 작은 업데이트로 말한 것이 정확합니다).

다음은 확장명이 사용되지 않을 때 전체 경로를 가진 copycd 와 동일한 우선 순위를 사용하지 않음을 보여주는 예제 입니다.

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 명령은 확장자를 사용할 때 파일 시스템에 우선 순위를 부여 한다는 것을 알았습니다 . 적어도 이것은 내부 명령이 서로보다 일관성있게 처리되고 있음을 의미합니다. 그러나 이는 파일 시스템 객체 (파일 또는 디렉토리)의 이름에 따라 다른 동작을한다는 것을 의미합니다. 그것은 행동이 실제로 모호한 내부 논리를 사용하는 것처럼 보입니다. 따라서 다른 운영 체제에서 작동하기 위해이 동작을 사용하는 것은 안전하지 않은 것으로 간주됩니다 .


"사용자가 설명하는 동작은 명령 줄 인터프리터 내부의 모든 명령과 일치합니다." ipconfig예를 들어 작동합니다.
Jonas Köritz 2016

@ JonasKöritz : 아니요. " IPConfig " 명령 바로 뒤에 슬래시를 넣을 수 있습니다 (예 :) IPCONFIG/ALL. 그러나 그것은 내가 말한 것이 아닙니다. " 당신이 설명하는 행동 "(질문에서)은 명령 이름 바로 뒤에 마침표를 두는 행동이었습니다. 입력 IPConfig.하면 명령을 찾을 수 없다는 오류가 발생합니다. 마찬가지로 (이것은 설명 한 동작과 관련이 없지만) 입력 하면 내가 만든 IPCONFIG\ALL사용자 정의 .\IPCONFIG\ALL.BAT파일을 실행할 수 있습니다 . 그래서 /' .또는' 처럼 취급되지 않습니다
TOOGAM

1
나는 당신의 답변을 받아 들여서 그 작품을 만들어내는 연구와 연구에 감사합니다!
Jonas Köritz 2016

2
@Calchas Simple test-실행 copy.exe또는 copy.comcmd를 사용해보십시오 . 작동하지 않습니다-실행 파일이 아닙니다.
Luaan

1
@Luann :에 관해서는 ipconfig, 나는 당신의 결론에 동의하지 않습니다. 이 질문은 명령 행 시작시 입력 된 내용에 관한 것입니다. Windows / DOS는 파일 이름 확장자로 실행 파일을 식별하므로 확장자없이 "ipconfig"라는 프로그램을 실행할 수 없습니다 (Windows에서는이를 허용하는 Unix와 달리). 다음 의견에 관해서, 나는 "Calchas"가 누군지 모른다. (at 기호를 지정하면 다음은 일반적으로 페이지의 다른 곳에 나타나는 사용자의 첫 문자입니다.) 동의합니다. " copy.exe"를 실행 하면 내부 copy명령 이 사용됩니다 (및 전달 .exe). (당신은 실행할 수 있습니다 .\copy.exe)
TOOGAM

41

명령 이름과 인수는 공백으로 구분해야한다고 가정하지만 사실이 아닙니다. 호출이 명확하게 해석 될 수있는 한 호출이 유효합니다.

이 경우, 첫 번째 인수로 시작 .하고 .명령 이름의 일부가 될 수 없습니다, 그래서 cd하고 ..간단하게 두 개의 분리 된 토큰으로 구문 분석됩니다.

일반적으로 첫 번째 인수는 알파벳 문자 (예 : 경로 시작)로 시작하므로 명령 이름에 "블리드"되어 오류가 발생하지만 구문 문제는 아닙니다. 의미 론적입니다.

다음을 포함하여 다른 명령을 사용할 때도 동일한 효과를 볼 수 있습니다 echo.

echo...
..

때문에이 경우, 우리는 두 기간을 얻을 명령 자체가 특별한 규칙이 다음 있도록 :echo

echo .

또는 확장하면 다음과 같습니다.

echo.

빈 줄만 출력합니다. 편리합니다. 분명히 그것은 논쟁에서 선행 기간을 무시함으로써 구현되었습니다.

안녕하세요, DOS / 배치입니다. 건강을 원하십니까? :디


2
이 창 명령 행에 고유 때문에이 가정, 예를 들어 bash는 당신이해야합니까 허용하지 않습니다cd..
조나스 Köritz

47
@ JonasKöritz : 완전히 다른 운영 체제에서 완전히 다른 프로그램입니다. 허용하지 않습니다 내 자전거 cd..: 중
궤도의 밝기 경주

15
@ JonasKöritz :alias cd..='cd ..'
mouviciel

5
@LightnessRacesinOrbit : 원래는 필터링의 바로 가기했다 ...다른 모든 디렉토리의 디렉토리로 표시하고 내가 아는 그 이상을 잡을 계획이없는. 필자는 실제로 파일 이름으로 암시 적으로 따르는 것보다 파일 속성으로 모델링 된 숨김 성을 더 깔끔한 디자인으로 간주합니다.
Joey

4
@joey-더 관련성이 높은 점은 DOS 접근 방식이 더 단순하다는 것이 아니라 DOS가 .파일 이름을 허용하지 않았기 때문에 명령 이름의 일부가 될 수 없으므로 인수의 일부가되어야 한다는 것을 의미합니다 . DOS가 유닉스 쉘처럼 명령을 인수로 나눈 경우에도 .명령 이름에 유효하지 않은 문자를 넣는 것은 의미가 없으므로 명령 뒤에 인수를 첫 번째 인수에 넣습니다.
Jules

19

cd..명령은 정확하고 그것은 원래의 명령 인터프리터에서 그렇게 정의 command.com나중에 지명되었다 cmd.exe.

명령 해석기는와 같은 특수 문자 cd..이므로 처리 방법을 알고 있습니다..\


8
주된 문제는 구문 이 어디서나 공식적으로 지정되지 않았기 때문에 명령이 "구문 적으로 잘못"될 수 없다는 것입니다 . 따라서 기본 구현 (cmd.exe 및 / 또는 MS-DOS)이이를 받아들이면 정확해야합니다.
grawity

3
또한 CD는 프로그램이 아니라 내부 명령입니다. 내부 명령이기도 한 Echo와 유사하게 작동 할 공간이 필요하지 않습니다. echo.빈 줄을 인쇄합니다.
LPChip

2
@Overmind echoe도 작동하지 않으므로 cd, echo, md 등과 동일합니다.
LPChip

2
@ JonasKöritz .는 삭제되지 않고 공백 만 추가됩니다. md.test그리고 md .test둘 다 디렉토리를 만듭니다 .test. 타이핑 cd.testcd .test디렉토리로 변경됩니다 .test.
daniel.neumann

6
@ JonasKöritz : 구문이 명령 공간 인수가 된 적이 없기 때문입니다.
궤도에서 가벼움 레이스

11

이전 버전과의 호환성 해킹입니다.

명령 행 인터프리터는 CP / M 명령 인터프리터와 역 호환되도록 설계된 원래 MSDOS 명령 인터프리터의 명령과 역 호환되도록 설계되었습니다. CP / M 또는 MSDOS .는 파일 이름을 허용하지 않습니다 (파일 이름의 두 부분 인 기본 이름과 확장자 사이의 구분 기호로 해석 됨). 이것은 (적어도 DOS 초기 버전의 경우) 명령 해석기가 '.'에 도달하면이를 식별 할 수 있음을 의미했습니다. (또는 실제로 파일 이름에서 불법 인 다른 문자) 명령 이름의 끝을지나 명령 인수에 포함되었습니다. 이것은 DOS와 CP / M에서 매우 일반적으로 사용되었습니다. 예를 들어, 파일을 가로 형식으로 나열 dir/w하는 것과 같은 매우 일반적인 명령이었습니다 dir /w.

요즘, '.' 파일 이름에 나타날 수 있습니다. 이로 인해 명령을 구문 분석하는 방법에 약간의 문제가 발생하지만 쉘은 여전히. 정확한 파일 이름의 일부가 아닌 인수를 인수의 시작으로 식별합니다 . 이는 수백만 명의 사용자가 입력 cd..또는 echo.그와 유사한 명령을 포함하는 많은 수의 배치 파일을 사용하는 데 익숙해 졌기 때문에 주로 필요 합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.