无法进入名称中带有空格的目录,即使使用引号或转义

无法进入名称中带有空格的目录,即使使用引号或转义

在 MacOS 机器上的 bash shell 中,我可以通过输入看到ls有一个导演Application Support

$ ls
Accounts                FontCollections     PreferencePanes
Application Scripts     Fonts               Preferences
Application Support     GameKit             Printers
Assistant               Google              PubSub
Assistants              Group Containers    Safari
Audio                   IdentityServices    SafariSafeBrowsing
Caches                  Input Methods       Saved Application State
Calendars               Internet Plug-Ins   Screen Savers
CallServices            Keyboard            Services
ColorPickers            Keyboard Layouts    Sharing
Colors                  KeyboardServices    Sounds
Compositions            Keychains           Spelling
Containers              LanguageModeling    Suggestions
Cookies                 LaunchAgents        SyncedPreferences
CoreFollowUp            Library             VirtualBox
Developer               Logs                Voices
Dictionaries            Mail                WebKit
F5Networks              Messages            com.apple.internal.ck
Family                  Metadata            iMovie
Favorites               Mobile Documents
FileProvider            Passes

但是,如果我尝试cd使用引号或转义字符进入该目录,如中所述如何进入名称中包含空格的目录?,我仍然收到错误:

LM-SJN-21018636:Library kupeek$ cd "Application Support"
-bash: cd: Application: No such file or directory
LM-SJN-21018636:Library kupeek$ cd Application\ Support
-bash: cd: Application: No such file or directory

看起来 bash 并没有“拾取”引号或转义符,而是在寻找名为“应用程序”的目录。有什么想法可以解释为什么它不起作用吗?

答案1

您的cd函数或别名可能定义不明确。运行type -a cd以找出原因。

可能的别名解释如下另一个答案。我的回答集中在 shell 函数上。

例如,如果使用函数

  • command cd $*command内置解释这里) 或者
  • command cd $@或者
  • command cd $1

而不是正确的

  • command cd "$@"或者
  • command cd "$1"(不如上面的好,但仍然不是致命的)

并且你的 Bash 没有抛出错误too many arguments(4.4 之前的版本,请参阅这个问题),其行为将与您描述的完全一样,因为Application Support作为函数的单个参数,它会在函数内部进行分词,因此command cd将被视为Application其第一个参数。

如果你的cd函数确实定义不明确,那么你应该跟踪它的定义位置并进行修复。一个特别指定解决方法是在command之前添加单词cd,如下所示:

command cd "Application Support"

或者

command cd Application\ Support

(如果别名是罪魁祸首,这也会起作用)。

答案2

尝试使用多组引号,

例如,将名称放在双引号内的单引号中:

cd "'Application Support'"

“用双引号括起来的参数即使包含空格分隔符,也会显示为一个单词。”高级 Bash 脚本指南

使用两组引号(引号内的引号)是一种可行的解决方法,假设这里的问题是原始cd命令已被别名化。以下定义

alias cd='eval command cd'

将重现此处报告的问题(在 Bash 4.4 之前的版本中,请参阅这个答案)。 碰巧的是,eval第二次解析命令行,在第一次解析时,一层引号被删除。 使用两组引号是可行的,因为删除第一组引号后,eval会将带有第二组引号的参数传递给cd

如果存在这样的别名,最好的解决方案就是首先修复它。

答案3

可能还有更多您看不到的空白或其他不可打印字符。请尝试cd Application*Scrip*或类似操作。

答案4

这是因为您漏掉了一个单词。请尝试使用:

cd "Application Support GameKit"

相关内容