![cd..가 Linux 터미널에서 작동하지 않는 이유는 무엇입니까?](https://linux55.com/image/156758/cd..%EA%B0%80%20Linux%20%ED%84%B0%EB%AF%B8%EB%84%90%EC%97%90%EC%84%9C%20%EC%9E%91%EB%8F%99%ED%95%98%EC%A7%80%20%EC%95%8A%EB%8A%94%20%EC%9D%B4%EC%9C%A0%EB%8A%94%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
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..
cdef
cd56
cd..
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.txt
copy..\filename newname
그러나 이는 내장 기능에서만 작동하며 "...내부 또는 외부 명령, 실행 가능한 프로그램 또는 배치 파일로 인식되지 않습니다."라는 오류가 발생합니다 calc..
. find..
따라서 몇 가지 흥미로운 예를 들면 다음과 같습니다.
- 라는 프로그램이 있는 경우
abcd.efg.exe
를 입력하여 실행할 수 있습니다abcd.efg
. 하지만 이라고 불리는 경우에는 로cd.efg.exe
구문cd.efg
분석되므로 실패합니다cd .efg
.cd.efg.exe
abcd
마찬가지로 현재 디렉터리에 하위 디렉터리가 호출되고efg.exe
해당 하위 디렉터리에서 호출되는 프로그램이 있는 경우 를 입력하여 실행할 수 있습니다abcd\efg
. 하지만 하위 디렉터리 가 호출되면cd
로cd\efg
구문 분석되므로 실패합니다cd \efg
.cd\efg.exe
답변4
cd
Windows에서는 내부 명령이므로 Windows에서는 실행 파일로 찾을 수 없습니다.
여기내부 DOS 명령 목록입니다.
그리고 cd
Linux 시스템에서는 /bin
.
[root@localhost j]# ls /bin/cd
/bin/cd
cd
Few 를 실행 하거나 anycommand
뒤에 올 때 args
bash는 $PATH 환경 변수( 로 설정될 수 있음)에 입력한 첫 번째 항목을 찾아 /usr/bin
프로그램을 실행하고 로 입력한 모든 항목을 제공하기 때문에 공백이 있는 인수만 허용할 수 있습니다 args
. 입력할 때 bash는 해당 프로그램을 찾을 수 없기 때문에 정확히 아래를 cd..
찾아 오류를 표시합니다.cd..
/usr/bin
이것이 더 나은 디자인입니다.