cd..가 Linux 터미널에서 작동하지 않는 이유는 무엇입니까?

cd..가 Linux 터미널에서 작동하지 않는 이유는 무엇입니까?

Windows/DOS 터미널에서 cd..디렉토리를 올바르게 변경합니다 .

Linux 터미널에서 다음을 가리킵니다.CD명령을 분리해야 합니다. 파서가 이 작업을 수행해야 하는 방법/이유를 알고 싶습니다. 공백이 추가되지 않으면 명령이 이해되지 않습니다.

이것은 아주 잘 작동합니다

 cd ..

이건 작동하지 않아

cd..

regExp 또는 명령을 구문 분석하는 모든 항목에는 명령 바로 뒤에 가능한 문자로 점이 포함되지 않을 수 있습니다.

답변1

일반적인 구문은 다음과 같습니다 cd ... Windows 명령 해석기는 더 유연하며 이 구문도 허용합니다 cd...

쉘을 사용할 cd..때 정확한 이름의 명령이나 프로그램을 찾으십시오.cd..

bash이 명령을 허용 하려면 cd..별칭을 정의하면 됩니다.

alias cd..="cd .."

답변2

실제 차이는 없습니다. Windows CMD 셸은 오타를 수용하기로 결정하는 반면, Linux 셸은 명령이나 프로그램(이 경우 셸에 내장된 CD)을 인수와 분리하는 데 더 엄격합니다.

답변3

Unix와 Linux에서는 왜 cd..작동하지 않습니까?

Unix 셸은 영숫자가 아닌 많은 문자(예: )를 문자로 처리  하므로  ,  ,  등이라는 @_+-{}:,./~이름의 명령을 사용할 수 있습니다 . 그래서 쉘이 그것을 볼 때 ,  또는  와 다르지 않은 4글자 단어로 보기 때문에 이름이 붙은 명령을 찾습니다 . 1 한 글자라고   해서 두 단어로 나뉘지 않아요a@b_c+d-cd..cdefcd56cd..d.아니요(CMD 방식, 아래 참조).
______________
1  지적한 바와 같이하카타, 이름이 붙은 별명(또는 쉘 함수(또는 쉘 스크립트))을 정의할 수 있습니다 cd... 물론  cd.. ( 또는 )라는 이름의 쉘 스크립트를 작성하는 것은 아마도 좋은 생각이 아닐 것입니다. 쉘 스크립트는 이를 호출하는 쉘이 디렉토리를 변경하도록 할 수 없기 때문입니다.cdanything

cd..CMD에서 작동하나요?

CMD가 명령을 구문 분석하는 방법에 대한 규칙은 복잡하고 잘 문서화되지 않은 것으로 보입니다.

  • 위키북설명하다:

    명령줄을 일련의 명령으로 구문 분석하는 것은 복잡하며 다양한 명령 해석기 간에는 미묘한 차이가 있습니다.

  • 데이비드 델리Windows에서는 "모든 사람이 다르게 구문 분석합니다"라고 합니다.

    명령줄을 ShowParams.exe(C/C++로 작성), ShowParams.vbs(VBScript) 또는 ShowParams.bat(배치 파일)에 전달하면 다른 결과를 얻게 됩니다.

  • Windows 명령 해석기(CMD.EXE)는 스크립트를 어떻게 구문 분석합니까? (스택 오버플로) 제목 질문에 대한 광범위하고 자세한 답변이 포함되어 있습니다.

...하지만 (약 한 시간 동안 검색했지만) CMD가 이를 결정하는 방법을 구체적으로 설명하는 내용을 찾을 수 없습니다. 명령이 뭐예요? (이것을 argv[0]우리는 Unix에서 C 프로그램이라고 부릅니다.)

Windows 7에서 몇 가지 테스트/실험을 수행했습니다. 내가 관찰한 패턴 중 하나는 첫 번째 토큰화 단계(공백 및 <,  >,  및 와 같은 우선순위가 높은 문자에서 명령줄 중단 ) 후에 CMD가 명령줄의 첫 번째 단어를 살펴보고 이를 이외의 다른 단어로 바꾸는 것입니다 &.  |-영숫자 포함,/.,  +,  =, 그리고  \).

  • 그 말이 닿으면첫 번째이러한 영숫자가 아닌 문자는 인수를 사용하지 않고 명령을 실행하는 내장 명령입니다. 예를 들어, cls.,  cls..,  cls.abc, , ,  cls.a.b.c,  cls.exe,  cls=, ,  cls=abc,  cls+,  cls+abc,  cls\,  및 간단  하고 명확한 화면 cls\abc과 같은 다양한 변형이 있습니다 . cls같은 상기와 pause.

    언뜻 보면 다음은 위의 사항에 대한 예외인 것처럼 보입니다.

    • cls/cls/a/b/c 오류 메시지를 표시합니다  . 
    • cls/? 도움말 메시지를 보내주세요.
    • pause/ 간단히  pause/a/b/c 일시 중지합니다(즉, 정상처럼 작동합니다 pause).
    • pause/? "계속하려면 아무 키나 누르십시오."라는 도움말 메시지가 표시됩니다. . ", 하지만 당신이 키를 누를 때까지 기다리지 않습니다.  (이것은 실수입니다.)
       

    그러나 위의 내용은 캐릭터 수준에서 토큰으로 분류하려는 CMD의 아이디어와 일치합니다  /. 예를 들어 cls/ 와 동일하게 동작합니다.cls /

  • echo 특별한 경우입니다:
    • echo on 에코를 켜세요.
    • echo off 에코를 끄세요.
    • 단순히 echo 에코 플래그의 상태를 보고합니다.
    • 그러나 if echo바로 뒤에 영숫자가 아닌 문자가 오는 경우(예 ,: , . 또는  /), 문자는 무시되지만 명령의 나머지 부분에 대한 특수 처리는 비활성화됩니다. 따라서 "on" 또는 "off"라는 단어를 인쇄하려면 echo.on 또는 를  사용 echo.off하고, 빈 줄을 인쇄하려면 를 사용하세요. 그래서 행동은 [sic]과 같습니다.echo.echo..echo .
  • 긴 이야기 짧게
    다른 경우에는 CMD가 존중하는 것 같습니다.마지막도트(또는 도트 그룹), 하위 문자열이 내장 명령인 경우 해당 내장 명령으로 해석됩니다. 따라서 cd..,  dir.., 및 모두 첫 번째 점 앞에 공백이 있는 것처럼 동작합니다. type..\filename.txtcopy..\filename newname

그러나 이는 내장 기능에서만 작동하며 "...내부 또는 외부 명령, 실행 가능한 프로그램 또는 배치 파일로 인식되지 않습니다."라는 오류가 발생합니다 calc.. .  find..따라서 몇 가지 흥미로운 예를 들면 다음과 같습니다.

  • 라는 프로그램이 있는 경우 abcd.efg.exe를 입력하여 실행할 수 있습니다 abcd.efg. 하지만 이라고 불리는 경우에는 로 cd.efg.exe구문 cd.efg분석되므로 실패합니다 cd .efg.cd.efg.exe
  • abcd마찬가지로 현재 디렉터리에 하위 디렉터리가 호출되고 efg.exe해당 하위 디렉터리에서 호출되는 프로그램이 있는 경우 를 입력하여 실행할 수 있습니다 abcd\efg. 하지만 하위 디렉터리 가 호출되면 cdcd\efg구문 분석되므로 실패합니다 cd \efg.cd\efg.exe

답변4

cdWindows에서는 내부 명령이므로 Windows에서는 실행 파일로 찾을 수 없습니다.

여기내부 DOS 명령 목록입니다.

그리고 cdLinux 시스템에서는 /bin.

[root@localhost j]# ls /bin/cd
/bin/cd

cdFew 를 실행 하거나 anycommand뒤에 올 때 argsbash는 $PATH 환경 변수( 로 설정될 수 있음)에 입력한 첫 번째 항목을 찾아 /usr/bin프로그램을 실행하고 로 입력한 모든 항목을 제공하기 때문에 공백이 있는 인수만 허용할 수 있습니다 args. 입력할 때 bash는 해당 프로그램을 찾을 수 없기 때문에 정확히 아래를 cd..찾아 오류를 표시합니다.cd../usr/bin

이것이 더 나은 디자인입니다.

관련 정보