终端不接受目录的完整输入

Pro*_*ity 4 gnome command-line bash gnome-terminal sublime-text

我试图了解 Sublime Text 3 构建系统的功能。进入 shell_cmd 的命令是直接进入终端的命令,但终端显示“不存在这样的文件或目录”。这是我制作的构建系统。

{
  "shell_cmd": "gnome-terminal -- bash -c '${file_path}/${file_base_name}; read -sn 1'",
  "file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
  "working_dir": "${file_path}",
  "selector": "source.c, source.c++, source.cxx, source.cpp",
  "variants":
  [
      {
          "name": "Run",
          "shell": true,
          "shell_cmd": "gnome-terminal -- bash -c '${file_path}/${file_base_name}; read -sn 1'"
      }
  ]
}
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

实际的文件路径是:'/home/dr_insult/COMPUTER PROGRAMS/DATA STRUCTURES & AGORITHMS/Stacks & Queues/'。我知道这是因为单词之间有空格引起的,但是构建系统中的 '' 引号不应该更正吗?

Dan*_*Dan 5

你的问题是你需要用引号封装你的路径。看起来你已经是了,但我猜你对你拥有的“字符串中的字符串”的数量感到困惑。

从您的 JSON 开始,您将shell_cmd密钥的值传递给您的程序,即:

gnome-terminal -- bash -c '${file_path}/${file_base_name}; read -sn 1'
Run Code Online (Sandbox Code Playgroud)

该命令正在启动gnome-terminal应用程序并要求它在启动时运行以下命令:

bash -c '${file_path}/${file_base_name}; read -sn 1'
Run Code Online (Sandbox Code Playgroud)

反过来,该命令正在执行bash并告诉它运行以下命令 -请注意不存在的引号

${file_path}/${file_base_name}; read -sn 1
Run Code Online (Sandbox Code Playgroud)

在运行之前,该命令将在执行之前将变量替换为其适当的值,并且根据您显示的错误消息,该命令将变为以下内容:

/home/dr_insult/COMPUTER PROGRAMS/DATA STRUCTURES & ALGORITHMS/Stacks & Queues/; read -sn 1
Run Code Online (Sandbox Code Playgroud)

最后,在这种情况下,发生的事情是 bash 通过在&字符上拆分命令来解析该命令,因为它认为它应该在后台运行多个命令,如下所示:

# This first command, for example, is attempting to run a script named
# /home/dr_insult/COMPUTER while passing two parameters
# "PROGRAMS/DATA" and "STRUCTURES" and attempting to put it in the background
/home/dr_insult/COMPUTER PROGRAMS/DATA STRUCTURES &
ALGORITHMS/Stacks &
Queues/
read -sn 1
Run Code Online (Sandbox Code Playgroud)

所有这些路径都不存在于您的系统中,这会引发您看到的那些错误。

您需要做的是引用您的那个命令,以便告诉 bash 将所有该字符串视为单个路径。

因此,将shell_cmd键的值更改为以下内容(您需要对双引号进行转义,以便您的 JSON 保持有效)

"gnome-terminal -- bash -c '\"${file_path}/${file_base_name}\"; read -sn 1'"
Run Code Online (Sandbox Code Playgroud)