我一直在尝试为我的bash配置文件编写一个函数已经有一段时间了。 我试图克服的问题是我通常提供包含空格的文件路径,在我尝试在终端中打开它之前,必须经历并逃避所有空间。
e.g。 档案 - > / Volumes / Company / Illustrators / Website Front Page Design.ai
我最终想要的是从我的终端打开'/ Volumes / Company / Illustrators / Website \ Front \ Page \ Design.ai'。
到目前为止,我已经设法逃脱了空间,但我得到错误“文件.....不存在。”
到目前为止,我的代码是
function opn { open "${1// /\\ }";}
非常感谢任何帮助。
答案 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"
应该可以正常工作。