Mac 终端进入含空格的文件路径
场景
在 mac 的终端中进入有空格的路径,会提示文件夹不存在
cd /Library/Application Support/Microsoft/MAU2.0
问题的根源在于 shell 用空格分隔参数。上面这条命令 shell 解析成 cd 加两个参数:/Library/Application 和 Support/Microsoft/MAU2.0。cd 只认第一个参数,于是去找 /Library/Application 这个不存在的目录,报 no such file or directory。
macOS 上带空格的路径特别多——Application Support、Mobile Documents、用户自己建的中文或带空格目录名,所以这个问题绕不开。
下图是报错的样子,注意提示的路径被截断在了空格处,这就是判断依据:

解决方法
对于有空格的路径需要在空格之间加入 ' '
单引号里的内容 shell 不做分词处理,所以 ' ' 相当于告诉 shell「这里是一个字面意义的空格,不是分隔符」:
cd /Library/Application' 'Support/Microsoft/MAU2.0
另外三种更常用的写法
上面那种写法能用但不太直观,实际我更常用下面这些。
整个路径用引号包起来,最清晰也最不容易出错,路径里有多少空格都不用管:
cd "/Library/Application Support/Microsoft/MAU2.0"
用反斜杠转义每个空格,这是 Tab 补全和拖拽自动生成的形式:
cd /Library/Application\ Support/Microsoft/MAU2.0
直接把文件夹从访达拖进终端。这是最省事的办法:输入 cd 加一个空格,然后把目标文件夹拖到终端窗口里,终端会自动填入路径并把空格转义好,回车即可。路径深、名字复杂时比手打靠谱得多。
Tab 补全同样会自动处理转义。输入 cd /Library/App 然后按 Tab,shell 补全出 Application\ Support/,转义已经加好了。养成用 Tab 的习惯基本就不会碰到这类问题。
单引号和双引号的区别
两种引号都能防止空格分词,但对变量的处理不一样。双引号里变量会被展开,单引号里不会:
cd "$HOME/My Documents" # $HOME 被替换成实际路径,可以用
cd '$HOME/My Documents' # $HOME 被当成字面字符,找不到目录
所以路径里要拼变量就用双引号,纯字面路径两种都行。写脚本时的通用建议是:所有可能含空格的变量引用一律加双引号,比如 cp "$src" "$dst",不加的话变量值里一有空格就会被拆成多个参数,是 shell 脚本最常见的 bug 来源之一。

还没有留言,来发表第一条吧~