很长一段时间以来,我一直试图为bash配置文件编写一个函数。我试图克服的问题是,我通常会获得包含空格的文件路径,在尝试在终端中打开它之前,必须先通过和逃离所有的空间,这是一种痛苦。
例如档案-> /卷/公司/插图/网站首页Design.ai
我试图结束的是‘/批量/公司/插画/网站\首页\ Design.ai’从我的终端打开。
到目前为止,我已经设法摆脱了空格,但我得到了错误“文件.不存在”。
到目前为止我的代码是
function opn { open "${1// /\\ }";}
任何帮助都将不胜感激。
发布于 2016-07-25 16:15:08
重要的是要理解语法和文字数据之间的区别。
如果正确执行,转义将是语法:它由shell读取并丢弃。也就是说,当你跑
open "File With Spaces"
或
open File\ With\ Spaces
甚至是
open File" "With\ Spaces
shell解析并删除...the引用和转义,执行的实际操作系统调用如下:
execv("/usr/bin/open", "open", "File With Spaces")
请注意,syscall的参数中没有任何反斜杠(或文字引号)!如果在数据中放置文字反斜杠,则会运行以下操作:
/* this is C syntax, so "\\" is a single-character backslash literal */
execv("/usr/bin/open", "open", "File\\ With\\ Spaces")
除非有一个带有反斜杠的文件名为...and,否则它就不能工作,从而给出您报告的“文件不存在”错误。
所以--只要用你的名字在引号上喊开:
open "$1"
.不需要opn
包装器
发布于 2016-07-25 16:14:12
空格在文件名中是有问题的,因为它们是bash
的默认IFS
(内部字段分隔器)的一部分,用于分隔命令行中的令牌。这意味着,默认情况下,当您使用command an argument with spaces
时,命令将接收4个参数,而不是包含空格的1个参数。
我猜您以同样的方式调用了您的opn
函数,从而只得到了路径的第一部分$1
。
希望修复是简单的:将路径用引号括起来,这样bash
就不会解释空格。通过这样做,您对opn
函数的需求就消失了:open "/Volumes/Company/Illustrators/Website Front Page Design.ai"
应该工作得很好。
https://stackoverflow.com/questions/38572630
复制相似问题