在 Windows/DOS 终端上cd..
正确更改目录。
在 Linux 终端上,点来自光盘命令必须分开。我想知道解析器如何/为什么需要这样做。如果没有添加空格,则无法理解该命令。
这个效果很好
cd ..
这不起作用
cd..
regExp 或解析命令的任何内容可能不会在命令之后立即包含点作为可能的字符。
答案1
正常的语法是cd ..
. Windows 命令解释器更加灵活并且也接受cd..
。
当您使用cd..
shell 时尝试查找名称准确的命令或程序cd..
为了让您bash
接受该命令,cd..
您可以定义一个别名:
alias cd..="cd .."
答案2
没有什么真正的区别。 Windows CMD shell 决定适应拼写错误,而 Linux shell 对于将命令或程序(在本例中为 shell 的内置 cd)与参数分开更加严格。
答案3
为什么cd..
在 Unix 和 Linux 上不起作用?
Unix shell 将许多非字母数字字符(例如, @_+-{}:,./~
)视为字母,因此您可以使用名为a@
、 b_
、 c+
、 d-
等的命令。因此,当 shell 看到 时cd..
,它会将其视为四个字母的单词,没有什么不同fromcdef
或 cd56
,因此它会查找名为 的命令cd..
。1 它不会仅仅因为d
是一个字母而 将其分成两个单词.
不是(CMD 的方式;见下文)。
_____________
1 正如指出的通过博多,您可以定义一个名为 的别名(或 shell 函数(或 shell 脚本))cd..
。当然,编写一个名为 cd..
(或 ) 的 shell 脚本可能不是一个好主意,因为 shell 脚本无法导致调用它的 shell 更改目录。cdanything
为什么cd..
在CMD下可以工作?
CMD 如何解析命令的规则似乎很复杂并且没有很好的文档记录。
- 维基教科书说:
将命令行解析为命令序列非常复杂,并且不同的命令解释器之间存在细微的差异。
- 大卫·德利据说,在 Windows 中,“每个人的解析方式都不同”:
如果将命令行传递给 ShowParams.exe(用 C/C++ 编写)、ShowParams.vbs (VBScript) 或 ShowParams.bat(批处理文件),您将得到不同的结果...
- Windows 命令解释器 (CMD.EXE) 如何解析脚本? (在 Stack Overflow 上)包含对标题问题的广泛、详细的回答。
…但是(在大约一个小时的搜索中)我找不到任何专门解决 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
,要打印空行,请使用。所以行为就像 [原文如此]。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
或anycommand
后跟 Few 时args
,bash 会查找您在 $PATH 环境变量中输入的第一个内容(该变量可能设置为 )/usr/bin
,执行程序并提供您稍后输入的任何内容作为args
。当您键入时,cd..
bash 将精确查找cd..
under/usr/bin
并给出错误,因为它找不到此类程序。
这是一个更好的设计。