在 shell 脚本中运行 python 脚本时出现问题,该脚本中包含空格

在 shell 脚本中运行 python 脚本时出现问题,该脚本中包含空格

我正在使用 shell 脚本进行一些自动化操作,但在运行路径有空格的 python 脚本时遇到问题。如果我在代码中犯了任何错误或不好的做法,请原谅我,我昨天才开始学习:)。

这是代码:

# grabs root directory from the script path
script_path="$( cd "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )"
proj_root="${script_path///modelsim}"
proj_root="${proj_root///test}"

# removing spaces
proj_root_no_spaces="${proj_root/' '/'\ '}"

log_dir=${proj_root_no_spaces}/src/python/graph_log.py #path to python file relative to root project dir

# checking output
echo "$log_dir"
create_graphs="python3 \""$log_dir"\""
echo "$create_graphs"

# run command
$create_graphs

该脚本给出以下输出:

1) /mnt/c/Users/Varun\ Govind/Desktop/roulette_BACKUP/roulette/src/python/graph_log.py 
2) python3 "/mnt/c/Users/Varun\ Govind/Desktop/roulette_BACKUP/roulette/src/python/graph_log.py"
3) python3: can't open file '"/mnt/c/Users/Varun\': [Errno 2] No such file or directory

第一行是python文件的完整路径,你可以看到我的用户名之间有一个空格,所以我用反斜杠转义了它。第二行是我正在运行的完整 python 命令;除了转义空格之外,我还用双引号将路径引起来。但是,如果我运行它,我会在第 3 行收到错误。

如果我将第 2 行直接复制并粘贴到 shell 中并运行它,它就会起作用。我不确定为什么我的命令在 shell 脚本中不起作用。我转义空格或运行 python 命令的方式有问题吗?

答案1

简短回答:参见BashFAQ #50:我试图将命令放入变量中,但复杂的情况总是失败!

长答案:不要尝试在变量中嵌入 shell 语法(如引号和转义符);变量用于数据,而不是语法。相反,只需在变量引用周围加上双引号即可(即,将引号放在大约变量,不是变量)。出于同样的原因,不要尝试将命令存储在变量中,只需直接执行它们即可。

因此,跳过proj_root_no_spaces并仅存储路径、未转义的空格和所有内容:

log_dir=${proj_root}/src/python/graph_log.py #path to python file relative to root project dir

然后不要将python3 ...命令存储在 中create_graphs,直接执行即可:

python3 "$log_dir"

相关内容