我问这里如何制作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
将参数解释为选项。--
在目录名称之前传递可避免这种情况。
另一种方法是让 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 spaces
work 进入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。)