Str*_*sky 23 bash alias directory functions
我在这里问如何制作cd保护空间。选项卡完成很棒,但有时您从剪贴板粘贴路径,因此这很有用。
然而,解决方案用括号打破。无论您如何尝试转义和保护输入,它始终会返回:
bash: syntax error near unexpected token `('
Run Code Online (Sandbox Code Playgroud)
有没有办法让它也处理括号?我想要的是,当我输入它时,它可以工作:
cd My path with spaces (and parentheses)
Run Code Online (Sandbox Code Playgroud)
Gil*_*il' 25
'在参数周围使用单引号。(这适用于任何命令,而不仅仅是cd)。
cd 'My path with spaces (and parentheses)'
Run Code Online (Sandbox Code Playgroud)
你不能让 bash 将括号传递给cd. 让空间发挥作用是一个非常专业的技巧。
单引号适用于除'自身之外的每个字符。用 4 个字符的序列替换单引号'\''。
cd 'Apostrophe'\''s a pain'
Run Code Online (Sandbox Code Playgroud)
如果目录名称以连字符开头,则这不起作用,因为这会导致cd命令将参数解释为选项。--在目录名称之前传递以避免这种情况。
另一种方法是让 shell 读取单独的文本行,而不是在命令行上传递参数。
Strapakowsky@darkstar ~$ read -r; cd -- "$REPLY"
My path with spaces (and parentheses)
Strapakowsky@darkstar ~/My path with spaces (and parentheses)$
Run Code Online (Sandbox Code Playgroud)
与其手动复制粘贴,不如以编程方式进行。安装xclip或xsel。
cd -- "$(xclip -o -selection clipboard)"
cd -- "$(xsel -bo)"
Run Code Online (Sandbox Code Playgroud)
您可以将其设为别名。
alias cde='cd -- "$(xsel -bo)"'
Run Code Online (Sandbox Code Playgroud)
cd访问名称中包含空格和括号等字符的目录:如果您的文件夹名称不包含单引号字符',只需将其括在单引号中:
cd 'My path with spaces (and parentheses)'
Run Code Online (Sandbox Code Playgroud)
如果它确实包含 a ',但不包含双引号字符"、反斜杠\、反引号`或美元$,请将其括在双引号中:
cd "My path with spaces (and parentheses)"
Run Code Online (Sandbox Code Playgroud)
文件名或目录名同时包含单引号和双引号的情况并不常见。(这可能是因为文件或目录名称根本不包含双引号。我最初不推荐双引号的唯一原因是,与单引号不同,双引号允许$扩展环境变量。如果您的文件名包含一个$字符后跟文本,这将是一个问题。)
如果它包含两者,或者您只想要另一种方法,那么您可以通过在每个空格和括号\之前插入一个反斜杠字符来手动转义它:
cd My\ path\ with\ spaces\ \(and parentheses\)
Run Code Online (Sandbox Code Playgroud)
这很烦人,但幸运的是,如果您键入名称的开头并按,shell会为您执行此操作Tab。如果有多个以 开头的文件或目录名称My,则您可能需要键入更多内容以使其展开。如果您按下Tab但它没有展开,您可以Tab再次按下以查看与您目前输入的内容相匹配的文件列表。然后你知道你必须输入多少才能让它唯一匹配并扩展。
或者,您可以转义内部引号。例如,假设您有一个名为:
Mischa's gardening tips for "home and office"
Run Code Online (Sandbox Code Playgroud)
您可以使用:
cd Mischa\'s\ gardening\ tips\ for\ \"home\ and\ office\"
Run Code Online (Sandbox Code Playgroud)
但您也可以简单地使用:
cd 'Mischa'\''s gardening tips for "home and office"'
Run Code Online (Sandbox Code Playgroud)
反斜杠在单引号内并不特殊,因此我们终止单引号字符串,附加一个反斜杠保护的单引号,然后立即开始另一个单引号字符串,所有这些都没有任何空格可以开始单独的参数。
cd按照您希望的方式工作:至于cd My path with spaces (and parentheses)开始工作:不,你真的不能那样做,因为这种行为不是特定于cd命令的,它是运行任何命令的方式的一部分。运行命令时,会给出用户提供的参数列表。当 shell 看到一个空格时,它知道一个参数刚刚结束,另一个参数刚刚开始。要将空格作为参数的一部分传递,必须以上述方式之一引用它。
您可以在某些时候实现其中的一部分——您可以让工作进入文件夹。您可以通过编写一个 shell 脚本来实现这一点,该脚本将所有用户提供的参数与空格连接起来。(然后,如果您愿意,您可以通过创建一个为其命名的 shell 别名来使自己调用该脚本;这将优先于您当前通常运行的内置 shell 。)但是:cd My path with spacesMy path with spacescdcdcd
该脚本将不接受不同的参数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 `('
Run Code Online (Sandbox Code Playgroud)
无论您更改什么,当给出该命令时,该语法错误都会继续发生。
我说您“可能”无法完成这项工作,因为有一种方法可以——您可以制作自己的外壳,按照您的意愿行事。但这非常困难,而且不太可能有人愿意这样做,只是为了进行这种改变。(您也可以修改现有 shell 的源代码,这是一个更实用的解决方案,但仍然需要比大多数人想要付出的更多努力。)除此之外,不太cd可能接受包含空格在内的任意字符的目录名称,就像在 Windows 上一样。
如果您想知道为什么这适用于 Windows 而不适用于 Ubuntu:在 Windows 中,命令将在它们之后键入的文本作为text 字符串传递,并且当命令需要将该字符串解释为一系列单独的参数(其中通常,但并非总是如此),命令的代码必须调用一个特殊的库函数来解析命令行字符串。(在 C 程序中,这发生在幕后,但仍涉及使用 Windows API。)
| 归档时间: |
|
| 查看次数: |
49679 次 |
| 最近记录: |