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

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

我问这里如何制作cd保护空格。制表符补全功能很棒,但有时您会从剪贴板粘贴路径,因此此功能很有用。

但是,解决方案会因括号而中断。无论你如何尝试转义并保护输入,它始终会返回:

bash: syntax error near unexpected token `('

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

cd My path with spaces (and parentheses)

答案1

使用单引号'将参数引起来。(这适用于任何命令,而不仅仅是cd)。

cd 'My path with spaces (and parentheses)'

您无法让 bash 将括号传递给cd。让空格完全发挥作用是一种非常专业的技巧。

单引号可以绕过除'其本身之外的所有字符。用 4 个字符序列替换单引号'\''

cd 'Apostrophe'\''s a 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)$ 

与其手动复制粘贴,不如通过编程来完成。安装剪辑或者響鳴

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

您可以将其设为别名。

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

答案2

如何正确cd访问名称中带有空格和括号等字符的目录:

如果您的文件夹名称不包含单引号字符',则只需将其括在单引号中:

cd 'My path with spaces (and parentheses)'

如果它包含',但不包含双引号字符"、反斜杠\、反引号`或美元符$,则将其括在双引号中:

cd "My path with spaces (and parentheses)"

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

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

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

这很烦人,但幸运的是,带有为你而做,如果您输入名称的开头并按Tab。如果有多个文件或目录名称以 开头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按照自己想要的方式完成工作:

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

你可以实现部分这个的一些的时间——您可以让cd My path with spaceswork 进入My path with spaces文件夹。您可以通过编写一个 shell 脚本来实现这一点,该脚本将其所有用户提供的参数用空格连接起来。(然后,如果您愿意,您可以cd通过创建一个以该脚本命名的 shell 别名来使其调用该脚本cd;这将优先于cd您当前通常运行的 shell 内置命令。)但是:

  • 该脚本不会接收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。)

相关内容