일부 자동화를 수행하기 위해 셸 스크립트를 사용하고 있는데 경로에 공백이 있는 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번째 줄을 셸에 직접 복사하여 붙여넣고 실행하면 작동합니다. 내 명령이 쉘 스크립트에서 작동하지 않는 이유를 잘 모르겠습니다. 공백을 탈출하거나 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"