我有时会弄乱终端,直到我输入“clear”。这种情况以各种方式发生,有时是在编写单个命令时,有时是在文本编辑器中编辑某些内容时。现在我有 Mac OS X Lion,但我记得几年前甚至在我还在使用 Solaris 时也遇到过这个问题。
以下是我成功重现的一个案例。如果我使用 cURL 时犯了一个错误:
Bemmu-Sepponens-MacBook-Pro:b2 bemmu$ curl --data abcde=foo efghijk=bar http://localhost:1234/do_something_cool
curl: (6) Couldn't resolve host 'efghijk=bar'
foo Bemmu-Sepponens-MacBook-Pro:b2 bemmu$
Curl 输出了“foo”和一条错误消息。现在,如果我按向上箭头返回编辑该命令,它首先会变成这样:
Bemmu-Sepponens-MacBook-Pro:b2 bemmu$ curl --data abcde=foo efghijk=bar http://localhost:1234/do_something_cool
curl: (6) Couldn't resolve host 'efghijk=bar'
foo Bemmu-Sepponens-MacBook-Pro:b2 bemmu$ curl --data abcde=foo efghijk=bar http://localhost:1234/do_something_cool
一切看起来仍然正常,但请注意,上一行放在来自 cURL 的“foo”之后。现在,如果我尝试多次按下左箭头以到达错误发生的位置并开始输入,事情就会变得一团糟:
foo Bemmu-Sepponens-MacBook-Pro:b2 bemmu$ curl --data abcde=foo&ijk=bar http://localhost:1234/do_something_cool
我所做的就是转到“abcde=foo ”后面的位置,按一次退格键,然后输入一个 & 符号。它应该变成“abcde=foo&fghijk=bar”,但实际上变成了“abcde=foo&ijk=bar”。
这是正常的吗,还是我的某些设置有错误?
答案1
如果curl
在 之后无法输出换行符,这在某种程度上是可以预料到的foo
。您可以尝试按⌃C一次,然后再按↑编辑命令。
还要注意,你应该对数据字符串进行转义,这样“&”符号就不会被解释为命令在后台运行作业。
例如:
charon:~ werner$ curl --data abcde=foo&efghijk=bar http://localhost:3000/
[1] 96980
-bash: http://localhost:3000/: No such file or directory
表示[1]
某项工作被放在后台,即这个:
[1]+ Exit 2 curl --data abcde=foo
因此,在 & 符号处,您的命令被截断了。您可以采取以下措施:使用&
反斜杠转义。
charon:~ werner$ curl --data abcde=foo\&efghijk=bar http://localhost:3000/
或者,您也可以将数据字符串放在单引号中以防止任何扩张:
charon:~ werner$ curl --data 'abcde=foo&efghijk=bar' http://localhost:3000/
答案2
您可以通过输入以下命令重置 OS X 以及我使用过的所有其他 *nix 上的终端:
echo ^V ESC c
在您的终端中。^V 表示“按住控制键并按下 `V' 键”,“ESC”只是按下退出键,而“c”显然是“c”键。
您正在做的是让 echo 吐出转义序列。
^V 表示您按下的下一个键(在本例中为 ESC)将逐字输入到终端中(没有它按 ESC 不会有太大作用),后面的“c”是实际代码。您可以在此处获取完整列表:http://ascii-table.com/ansi-escape-sequences-vt-100.php
这是一个硬重置,因此它可以修复您的终端可能出现的任何疯狂问题,尽管您有时可能会盲输入。