スペースを含むシェルスクリプトでPythonスクリプトを実行中に問題が発生しました。

スペースを含むシェルスクリプトでPythonスクリプトを実行中に問題が発生しました。

一部の自動化を実行するにはシェルスクリプトを使用していますが、パスにスペースがある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ファイルのフルパスです。私のユーザー名の間にスペースがあるので、バックスラッシュでエスケープしました。 2行目は、スペースをエスケープすることに加えて、パスを二重引用符で囲んで実行されている完全なPythonコマンドです。ただし、実行すると3行目でエラーが発生します。

2行目をシェルに直接コピーして貼り付けて実行すると機能します。私のコマンドがシェルスクリプトで機能しない理由はわかりません。スペースをエスケープしたり、Pythonコマンドを実行する方法に問題がありますか?

ベストアンサー1

短い答え:参照BashFAQ#50:コマンドを変数に入れようとしていますが、複雑な場合は常に失敗します!

長い答え:変数にシェル構文(引用符やエスケープなど)を含めようとしないでください。変数は構文ではなくデータ用です。代わりに、変数参照の周りに二重引用符を入れてください。について変数ではなく存在する変わりやすい)。同じ理由で、コマンドを変数に保存しようとせずに直接実行してください。

したがって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"

おすすめ記事