[英]Python: subprocess and running a bash script with multiple arguments
[英]Variable notation when running python commands with arguments in a bash script
我有一個 bash 腳本,它正在運行一堆帶有參數的 python 腳本。 為了有一個干凈的代碼,我想在腳本中使用變量
#!/bin/bash
START=0
SCRIPT_PATH="/opt/scripts/"
IP="192.168.1.111"
if [ "$START" = "0" ]; then
printf "%s: Starting\n" "$DATE_TIME"
PORT=1234
TEST_FILE="$SCRIPT_PATH/Test Scripts/test.TXT"
SCRIPT="$SCRIPT_PATH/script1.py"
ARGS="-P $SCRIPT_PATH/script2.py -n 15 -p $PORT -i $IP"
python "$SCRIPT" ${ARGS} -f "${TEST_FILE}" > ./out.log 2>&1 &
fi
這段代碼實際上有效,但我不明白的事情很少:
-f "${TEST_FILE}"
到ARGS
變量的最佳方法是什么,而不會在空格上阻塞 python 並拋出錯誤: "$SCRIPT_PATH/Test " not found
當您在參數列表周圍用引號括起來時,參數向量會收到一個參數,其中的所有內容都用引號括起來,因此,參數解析器無法正常工作,並且您遇到了問題。
關於你的第二個問題,把引號嵌入到數組中並不容易,因為引號在存入數組之前會被解析,然后當你執行數組擴展來運行命令時,它們會丟失並失敗。 我已經嘗試了幾次,但沒有成功。
另一種方法意味着您稍微修改腳本以使用自定義內部字段分隔符 (IFS) 來手動判斷哪些應該被視為參數,哪些不是:
#!/bin/bash
START=0
SCRIPT_PATH="/opt/scripts/"
IP="192.168.1.111"
if [ "$START" = "0" ]; then
printf "%s: Starting\n" "$DATE_TIME"
PORT=1234
TEST_FILE="$SCRIPT_PATH/Test Scripts/test.TXT"
SCRIPT="$SCRIPT_PATH/script1.py"
OLD_IFS=$IFS
IFS=';'
ARGS="$SCRIPT;-P;$SCRIPT_PATH/script2.py;-n;15;-p;$PORT;-i;$IP;-f;$TEST_FILE"
python ${ARGS} > ./out.log 2>&1 &
IFS=$OLD_IFS
fi
如您所見,我用分號替換了 ARGS 中的空格。 這樣, TEST_FILE
變量內容將被視為 bash 的單個參數,並將正確填充到參數向量中。 為簡單起見,我還將腳本移至參數向量,否則,由於我們對 IFS 進行了此修改,Python 將無法獲得正確的腳本路徑並失敗。
我在想這樣的事情(編輯了一些多余的東西以使其成為一個獨立的例子):
#!/bin/bash
SCRIPT_PATH="/opt/scripts/"
IP="192.168.1.111"
PORT=1234
TEST_FILE="$SCRIPT_PATH/Test Scripts/test.TXT"
SCRIPT="$SCRIPT_PATH/script1.py"
set -a ARGS
ARGS=(-P "$SCRIPT_PATH/script2.py" -n 15 -p "$PORT" -i "$IP")
ARGS+=(-f "${TEST_FILE}")
python3 -c "import sys; print(*enumerate(sys.argv), sep='\n')" "${ARGS[@]}"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.