【问题标题】:After a pipe the command is considered prefixed with a space在管道之后,命令被认为以空格为前缀
【发布时间】:2013-11-28 18:22:19
【问题描述】:

有时在我的终端 (Ubuntu) 上键入:

ls | grep toto

我收到此错误:

 grep: command not found*

请注意,shell 正在编写以空格为前缀的 grep。 这怎么可能?

【问题讨论】:

  • 很奇怪。另外,请注意,您可以对 ls *toto* 执行相同的操作
  • 你能可靠地复制它吗?是ls | grep 命令行上唯一的东西?这看起来像是在某处有一个引用,转义了初始空间。
  • 这是某种特殊的空格吗?不间断的空间、狭窄的空间等
  • 在 CentOS 中运行良好。
  • @user2854544,我只能使用ls |\ grep toto 重现该错误。是否有可能您的终端发送的不是实际的 space,例如类似空间的 Unicode character

标签: bash ubuntu grep pipe


【解决方案1】:

source>

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

ls |&#160;grep toto

感谢您复制粘贴实际行! (但你没有复制粘贴错误信息,你太淘气了!)看到问题了吗?管道符号后有一个牢不可破的空格。 Shell 只能理解 ASCII 字符;所有非 ASCII 字符,包括 U+00A0 NO-BREAK SPACE,都被视为单词组成部分,因此不可分割的空格被视为位于命令名称位置的单词的一部分。

您可能正在使用一种键盘布局,您需要按住 AltGr 来键入|。确保释放 AltGr 修饰符,以免意外键入 AltGr+Space 而不是 Space。请注意,此处不需要空格,您可以输入ls |grep toto,如果这对您来说更容易的话。

【讨论】:

  • 可以说。 Bash 的解析器应该将不间断空间规范化为常规空间。
  • @tripleee 这很棘手:bash 必须假设字符串的编码与语言环境指定的编码相匹配,这在实践中并非总是如此,并且会破坏一些现有的应用程序。
  • 非常感谢您的回答。直到现在我都认为这是一个错误。
  • 我的问题,为了记录,实际上是Shift + Space(我的管道字符需要shift
【解决方案2】:

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

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

或者从命令行

setxkbmap -option "nbsp:none"

我在 http://my.opera.com/nicomen/blog/unrecognized-character-xc2 中找到了此修复程序。

这在 Perl 脚本的法语键盘上使用大括号或在 Python 中使用哈希符号作为后跟空格的 cmets 时也很烦人。

【讨论】:

猜你喜欢
  • 2021-01-16
  • 2017-04-05
  • 2012-11-03
  • 2013-05-11
  • 2014-12-11
  • 1970-01-01
  • 1970-01-01
  • 2018-05-06
  • 1970-01-01
相关资源
最近更新 更多