2013-11-15 41 views
11

有时我的终端(Ubuntu的)上后:当我输入管道命令被认为与空间前缀

ls | grep toto 

我得到这个错误:

grep: command not found* 

注意,外壳是写grep以空格为前缀。 这怎么可能?

+0

这很奇怪。另外,请注意,您可以使用'ls * toto *'' – fedorqui

+1

做同样的事情您能否可靠地重现它?是ls | grep的东西在命令行上唯一的东西?这看起来像是在某处引用了一个引号,从而避开了最初的空间。 – rbp

+0

这是某种特殊的空白吗?非破坏性空间,狭窄的空间等。 – knittl

回答

24

<检查你原来的问题的source >

<pre style="width:650px; white-space:pre-wrap">Sometimes on my terminal (Ubuntu) when I type : 

ls |&#160;grep toto 

感谢您的复制粘贴实际线! (但你没有复制粘贴错误信息,调皮你!)看到问题了吗?管道符号后面有一个牢不可破的空间。壳只理解ASCII字符;包括U + 00A0 NO-BREAK SPACE在内的所有非ASCII字符都被视为单词组成部分,以便将不可破坏的空格视为命令名称位置中的单词的一部分。

你大概使用键盘布局,你需要按住AltGr键入|。确保释放的AltGr修改,以免意外键入的AltGr + 空间,而不是空间。请注意,您不需要空间,如果您的手指更容易打字,则可以输入ls |grep toto

+0

做得好,就是它 – user2854544

+0

可以说,Bash的解析器应该将non-breaking空间规范化为常规空间。 – tripleee

+0

@tripleee这将是棘手的:bash将不得不假定字符串的编码与区域设置指定的编码相匹配,实践中并非总是如此,并且会破坏一些现有的应用程序。 – Gilles

5

要完成Gilles的回答,您可以在Ubuntu/Gnome中禁用此行为,方法是用键盘布局设置中的常用空格替换不可破坏的空格字符。

设置 - >键盘 - >布局 - >选项,并选择“使用空格键输入不可破坏的空格字符”并将其设置为:“任何级别的通常空间”。

,或者在命令行

setxkbmap -option "nbsp:none" 

http://my.opera.com/nicomen/blog/unrecognized-character-xc2发现此修复程序。

在使用大括号时,这在法语键盘上对于使用大括号的Python脚本也很烦人,或者在使用散列符号注释后跟空格的时候,这也是令人讨厌的。

+0

另外https://stackoverflow.com/questions/8694442/bash-piping-in-osx-prompts-command-没有找到 - 有时它有一个很好的替代解决方法,它不依赖于X. – tripleee