我正在尝试创建一个.sh文件,以便在假期期间在Python上批量运行神经网络。
此刻,我已经从命令行调用了此命令:
python neural_network_trainer.py [args]
我现在编写了一个.sh脚本:
#!/bin/bash
python neural_network_trainer.py [args]
# Repeated with varied args
我试图在与原始命令行运行相同的终端中进行调用:
./august_hols.sh
我收到以下错误:
File "/data/Python-3.6.9/lib/python3.6/site.py", line 177
file=sys.stderr)
^
SyntaxError: invalid syntax
(由于某些原因)Python安装位于/ data中。
在命令行上运行which
报告通过~/.bashrc
中的别名设置的正确Python目录:
alias python=/data/Python-3.6.9/bin/python3
但是在Bash shebang和第一个python调用报告which
之间运行/bin/python
。
我试图在.sh脚本的开头再次设置别名无效。我挠头,因为这是我在其他地方使用过的确切过程,尽管不在此精确PC上。我可以将确切的命令从bash文件的顶部复制到终端中,并且可以正常运行,尝试调用./august_hols.sh
并获得上述Python错误。
Bash从何处获取该路径,为什么它不使用我预期的通过〜/ .bashrc的路由?
答案 0 :(得分:2)
Bash子Shell在主Shell中不继承别名
您可以获取脚本(在主外壳中运行),而不是执行脚本(在子外壳中运行)
源script.sh
编辑:
解决方案2:
运行bash作为登录shell,以便执行〜/ .bashrc,以便在脚本之前加载别名。
子外壳需要是交互式的才能启用别名,因为默认情况下仅对交互式外壳启用别名,而脚本默认情况下是非交互式的。
bash --login -i script.sh
解决方案3:
与上述类似,但显式启用了别名
bash --login -O expand_aliases script.sh
答案 1 :(得分:0)
您尝试过吗:
python=/data/Python-3.6.9/bin/python3 ./[your_bash].sh
答案 2 :(得分:0)
在您的.sh
这样做
#!/usr/bin/env bash
export PATH=/data/Python-3.6.9/bin:$PATH
exec python neural_network_trainer.py "$@"
别名是棘手的。
答案 3 :(得分:0)
也许更讨厌的解决方案
mapfile < <(declare -p | grep -m 1 BASH_ALIASES) && bash script.sh "${MAPFILE[@]}"
您将需要在脚本中
shopt -s expand_aliases
eval $1
echo ${BASH_ALIASES[python]}
python --version
答案 4 :(得分:0)
如何?
#!/bin/bash
/data/Python-3.6.9/bin/python3 neural_network_trainer.py [args]
# Repeated with varied args