我目前有一个文件夹结构,其中包含一些需要从某个文件夹触发的python脚本,但我想编写一个全局脚本,通过每个文件夹中的单独脚本运行每个python脚本。
-Obtainer
--Persona
---亚瑟
----start.sh
--Initialise.sh
-Persona
--Arthur
--- LIB
---- pybot
-----pybot.py
当我运行初始化时,我的目标是使初始化运行“start.sh”Arthur是机器人,并且将有更多具有不同名称的文件夹,并使用find和fire初始化每个start.sh。
在initialise.sh中我有:
#!/bin/bash
. ./Persona/Arthur/start.sh
在start.sh中我有:
#!/bin/bash
python ../../../Persona/Arthur/lib/pybot/pybot.py
我收到此错误:
python: can't open file '../../../Persona/Arthur/lib/pybot/pybot.py': [Errno 2] No such file or directory
但是,如果我从其目录运行start.sh本身,它运行正常。这是因为我认为它是从正确的shell运行它,因此目录。有没有办法让主脚本在它自己的shell中运行start.sh,就像它自己运行一样?原因是因为pybot.py将一堆文件保存到启动脚本所在的位置,并且因为将有多个bot需要它们保存在每个单独的文件夹中。
答案 0 :(得分:1)
首先,当你的意思是打电话时,不要采购,
#!/bin/bash
. ./Persona/Arthur/start.sh
不要这样做。
您的脚本存在许多问题。由于您当前的工作目录不确定,它不会起作用。你最好让自己的脚本从abs路径或相对路径的喧嚣中解脱出来。
一般代码可能是
script_dir=`dirname "${BASH_SOURCE[0]}"`
然后您可以使用它来导出目标文件的路径,
#!/bin/bash
script_dir=`dirname "${BASH_SOURCE[0]}"`
"$script_dir/Persona/Arthur/start.sh"
你的python调用变为:
#!/bin/bash
script_dir=`dirname "${BASH_SOURCE[0]}"`
python "$script_dir/../../../Persona/Arthur/lib/pybot/pybot.py"
这应该可以正常运作。
关于BASH_SOURCE
,请查看https://www.gnu.org/software/bash/manual/html_node/Bash-Variables.html
如果您希望start.sh
目录为cwd,则应致电cd
:
#!/bin/bash
script_dir=`dirname "${BASH_SOURCE[0]}"`
cd "$script_dir"
python "$script_dir/../../../Persona/Arthur/lib/pybot/pybot.py"