尝试在另一个目录中运行应用程序

尝试在另一个目录中运行应用程序

我们有一个在特定目录中运行的应用程序,它使用 flask(以前从未使用过它),并且它被调用自/home/automation_admin/rest-auto/production/TestLauncherApp

进入该目录后,我们运行flask run --host=0.0.0.0 --port=6000 &

我可以通过这种方式毫无问题地运行。如果我从我的主目录尝试并使用:

/home/automation_admin/rest-auto/production/TestLauncherApp/ "flask run --host=0.0.0.0 --port=6000 &" 

我得到:

No such file or directory

我正在尝试设置它以便它在启动时运行,并且有一个.shcron 应该在启动时运行的文件,但是当我.sh手动尝试该文件时,它有:

#!/bin/sh
#Starts the automation website on reboot
 /home/automation_admin/rest-auto/production/TestLauncherApp/ "flask run --host=0.0.0.0 --port=5000 &"

我得到:

./auto.sh: 3: /home/automation_admin/rest-auto/production/TestLauncherApp/flask run --host=0.0.0.0 --port=5000 &: not found

我怎样才能让它工作?

答案1

从脚本中得到的错误:

./auto.sh: 3: /home/automation_admin/rest-auto/production/TestLauncherApp/flask run --host=0.0.0.0 --port=5000 &: not found

表明 shell 尝试运行的实际路径是

/home/automation_admin/rest-auto/production/TestLauncherApp/flask run --host=0.0.0.0 --port=5000 &

在哪里每个空格都属于路径。这是因为在脚本中您引用了这些空格:

/home/automation_admin/rest-auto/production/TestLauncherApp/"flask run --host=0.0.0.0 --port=5000 &"

(在问题主体中,第一个空格之前有一个未加引号的空格",但我认为这是一个拼写错误,因为带有空格的形式会产生不同的错误。)

由于引用,解释脚本的 shell 将整行(在删除引号) 作为一个词,您要运行的可执行文件。您从脚本中得到的错误表明未找到此类可执行文件。

另一方面, 中的空格flask run --host=0.0.0.0 --port=6000 &不加引号,因此当您运行它时,shell 会将其识别为&命令终止符、flask命令(可执行运行)run以及命令的单独命令行参数。--host=0.0.0.0--port=6000

脚本中没有引号的那行看起来更好,尽管这是不必要您要运行的线路:

/home/automation_admin/rest-auto/production/TestLauncherApp/flask run --host=0.0.0.0 --port=5000 &

这里应该运行的可执行文件是/home/automation_admin/rest-auto/production/TestLauncherApp/flask。它不一定是你想要的,因为当你在flask …将目录更改为 后运行时TestLauncherApp,你运行flask的是位于PATH

如果你./flask …调用shell 将(尝试)flask在当前工作目录中运行.可能flask被解析PATH,也可能不被解析./flask。如果你的PATH包含当前工作目录(明确或作为.flask) 并且在 之前出现的目录中没有PATH,则将flask./flask

换句话说,问题告诉我你运行flask但可能没有运行/home/automation_admin/rest-auto/production/TestLauncherApp/flask。因此,我不能确定尝试运行后者的线路是否是你需要的。

如果flask run --host=0.0.0.0 --port=6000从一个路径调用时可以工作,那么从另一个路径调用时也应该可以工作,除非:

  • .在 中,PATH并且 意味着flask如上所述./flask。则./flask可能存在于一个目录中,但不存在于另一个目录中。
  • 或者也许run是相对路径的意思./run;这同样适用于其他参数。如果你的flask这个thenrun是其内部命令。--host=0.0.0.0并且--port=6000绝对看起来像不依赖于当前工作目录的选项。因此,在您的情况下,这个潜在问题很可能不是问题。
  • 或者可能flask隐式使用当前工作目录(例如,它尝试在那里读取或创建文件)并且另一个目录不适合此(例如,没有必要的文件,或者由于权限不足而无法创建新文件)。

我认为您确实需要将工作目录更改为/home/automation_admin/rest-auto/production/TestLauncherApp

你的脚本应该完全按照你flask在交互式 shell 中运行的方式执行:

#!/bin/sh
cd /home/automation_admin/rest-auto/production/TestLauncherApp
flask run --host=0.0.0.0 --port=6000 &

或者更好(以防cd失败):

#!/bin/sh
cd /home/automation_admin/rest-auto/production/TestLauncherApp \
&& flask run --host=0.0.0.0 --port=6000 &

它仍将用于PATH定位。如果您在交互式 shell 中flask运行脚本,那么它将从交互式 shell 继承;所以它应该可以工作。但如果脚本以以下方式运行,一般会有所不同:./auto.shPATHPATH来自 cron或者sudo,或者从 启动rc.local,或者使用systemd,或者以任何不同于交互式 shell 的方式启动。在这种情况下,最直接的解决方案是使用flask可执行文件的绝对路径。

或者或许你故意想/home/automation_admin/rest-auto/production/TestLauncherApp/flask反对 flask从您的PATH(例如,因为这些是不同的版本,而您严格想要前者)。在这种情况下,即使您要从交互式 shell 中使用脚本,也要使用完整路径。更改目录可能没有必要。

需要明确的是:当前工作目录和 shell 找到的目录flask两个不同的概念。使用cd您设置的当前工作目录。另一个取决于PATH,除非flask您使用包含的路径/(例如./flaskanother/relative/path/to/flask/absolute/path/to/flask)。这个答案很长,因为我不确定您是否想通过cd和运行(问题的开头表明了这一点),或者您想使用精确的绝对路径(您从不完善的脚本中得到的错误表明了这一点)。flaskPATH/home/automation_admin/rest-auto/production/TestLauncherApp/flask

相关内容