如何保护传递给cd命令的括号?

我在这里问如何制作cd保护空间。 选项卡完成很棒,但有时您会从剪贴板粘贴路径,因此这很有用。

然而,解决方案打破了括号。 无论你如何尝试逃避并保护输入,它总是返回:

 bash: syntax error near unexpected token `(' 

有没有办法让它也处理括号? 我想要的是,当我输入它时,它的工作原理是:

 cd My path with spaces (and parentheses) 

在参数周围使用单引号。 (这适用于任何命令,而不仅仅是cd )。

 cd 'My path with spaces (and parentheses)' 

你不能让bash将括号传递给cd 。 让空间工作是一个非常专业的黑客。

单引号可以解决除'本身”之外'每个字符。 用4个字符的序列'\''替换单引号。

 cd 'Apostrophe'\''sa pain' 

如果目录名以连字符开头,则不起作用,因为这会导致cd命令将参数解释为选项。 传递--在目录名称之前避免这种情况。

有关详细信息,请参阅https://unix.stackexchange.com/questions/69144/how-do-i-escape-a-sub-directory-name-with-an-ampersand-in-it/69147#69147 。

另一种方法是让shell读取单独的文本行,而不是在命令行上传递参数。

 Strapakowsky@darkstar ~$ read -r; cd -- "$REPLY" My path with spaces (and parentheses) Strapakowsky@darkstar ~/My path with spaces (and parentheses)$ 

您可以通过编程方式进行手动复制粘贴,而不是手动复制粘贴。 安装xclip或xsel 。

 cd -- "$(xclip -o -selection clipboard)" cd -- "$(xsel -bo)" 

你可能会把它变成别名。

 alias cde='cd -- "$(xsel -bo)"' 

如何正确cd到名称中包含空格和括号等字符的目录:

如果您的文件夹名称不包含单引号字符,请将其用单引号括起来:

 cd 'My path with spaces (and parentheses)' 

如果它确实包含' ,但不包括双引号字符" ,反向间隙\ ,反引号`或美元$ ,请用双引号括起来:

 cd "My path with spaces (and parentheses)" 

文件或目录名称包含单引号和双引号并不常见。 (这可能是由于文件或目录名称根本不包含双引号的原因。我最初不推荐双引号的唯一原因是,与单引号不同,双引号允许$扩展环境变量如果您的文件名包含$字符后跟文本,这将是一个问题。)

如果它包含两者,或者您只想要另一种方法,则可以通过在其前面插入反斜杠字符\手动转义每个空格和括号:

 cd My\ path\ with\ spaces\ \(and parentheses\) 

这很烦人,但幸运的是,如果您键入名称的开头并按Tab键 ,shell 会为您执行此操作 。 如果有多个以My开头的文件或目录名称,则可能需要输入更多文件或目录名称才能使其扩展。 如果按Tab键并且它没有展开,则可以再次按Tab键以查看与您目前输入的内容相匹配的文件列表。 然后你知道你必须输入多少才能使它与唯一匹配和扩展匹配。

或者,您可以转义内部引号。 例如,假设您有一个名为的文件夹:

 Mischa's gardening tips for "home and office" 

您可以使用:

 cd Mischa\'s\ gardening\ tips\ for\ \"home\ and\ office\" 

但你也可以简单地使用:

 cd 'Mischa'\''s gardening tips for "home and office"' 

反斜杠在单引号内并不特殊,因此我们终止单引号字符串,附加反斜杠保护的单引号,并立即启动另一个单引号字符串,所有字符串都没有任何可以启动单独参数的空格。

为什么你可能无法按照你想要的方式工作?

至于获取cd My path with spaces (and parentheses)工作:不,你真的不能这样做,因为这种行为不是特定于cd命令,它是运行任何命令工作方式的一部分。 运行命令时,会给出用户提供的参数列表。 当shell看到一个空格时,它知道一个参数刚刚结束而另一个刚刚开始。 要将空格作为参数的一部分传递,必须以上述方式之一引用。

你可以在某些时候实现这一部分 – 你可以制作cd My path with spaces可以进入My path with spaces文件夹的My path with spaces 。 您可以通过编写一个shell脚本来实现这一点,该脚本将所有用户提供的参数与空格连接起来。 (然后,如果你想要你可以让cd自己调用那个脚本,通过为它创建一个名为cd的shell别名;这将优先于你目前正在运行的shell内置cd 。)但是:

  • 脚本不会收到My path with spaces My path with spaces My path with spaces不同参数,所以cd My path with spaces会失败或输入错误的文件夹。

  • 您无法对括号执行此操作,因为这些用于shell的分组,因此它们不会以任何方式传递给命令。 实际上,大多数情况下shell只会抛出语法错误(就像你看到的那样):

     ek@Kip:~$ cd My path with spaces (and parentheses) bash: syntax error near unexpected token `(' 

    无论您更改什么,当给出该命令时,将继续发生该语法错误。

我说你“可能”不能使这项工作,因为有一种方法可以 – 你可以制作你自己的shell,你的行为符合你的意愿。 但这非常困难,任何人都不太可能想要这样做,只是为了做出这种改变。 (您也可以修改现有shell的源代码,这是一个更实用的解决方案,但仍然需要比大多数人想要的更多努力。)除此之外, cd不太可能接受包含空格的任意字符的目录名称它们就像在Windows上一样。

如果您想知道为什么它在Windows上工作但在Ubuntu中不工作:在Windows中,命令被传递为在它们之后键入的文本作为文本字符串 ,并且当命令需要将该字符串解释为一系列单独的参数时(它通常但不总是这样,命令的代码必须调用一个解析命令行字符串的特殊库函数。 (在C程序中,这发生在幕后,但仍然涉及使用Windows API。)