BASH函数用于在打开文件名之前转义文件名中的空格

时间:2016-07-25 16:07:55

标签: bash terminal

我一直在尝试为我的bash配置文件编写一个函数已经有一段时间了。 我试图克服的问题是我通常提供包含空格的文件路径,在我尝试在终端中打开它之前,必须经历并逃避所有空间。

e.g。 档案 - > / Volumes / Company / Illustrators / Website Front Page Design.ai

我最终想要的是从我的终端打开'/ Volumes / Company / Illustrators / Website \ Front \ Page \ Design.ai'。

到目前为止,我已经设法逃脱了空间,但我得到错误“文件.....不存在。”

到目前为止,我的代码是

function opn { open "${1// /\\ }";}

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:4)

要理解的重要一点是语法文字数据之间的区别。

正确完成后,转义为语法:它被shell读取并丢弃。也就是说,当你运行

open "File With Spaces"

open File\ With\ Spaces

甚至

open File" "With\ Spaces

...引用和转义由shell解析和删除,并且执行的实际操作系统调用是:

execv("/usr/bin/open", "open", "File With Spaces")

请注意,该系统调用的参数中没有任何反斜杠(或文字引号)!如果您在数据中添加了文字反斜杠,那么就会导致它运行:

/* this is C syntax, so "\\" is a single-character backslash literal */
execv("/usr/bin/open", "open", "File\\ With\\ Spaces")

...除非其名称中包含反斜杠的文件,否则该文件不起作用,并且"文件不存在"你报错了。

所以 - 只需在引号中用你的名字打开:

open "$1"

......不需要opn包装器。

答案 1 :(得分:0)

空格在文件名中存在问题,因为它们是bash默认IFS(内部字段分隔符)的一部分,用于在命令行中分隔标记。这意味着默认情况下,当您使用command an argument with spaces时,该命令将接收4个参数而不是1个包含空格。

我猜测你以同样的方式调用了opn函数,因此只会将路径的第一部分设为$1

希望修复很简单:将您的路径括在引号中,以便bash不会解释空格。通过使用此功能,您opn函数的需求将消失:open "/Volumes/Company/Illustrators/Website Front Page Design.ai"应该可以正常工作。