如何進入python環境並執行一些python命令並使用shell腳本返回普通終端
抱歉,標題可能不清楚。這是我懷疑的完整解釋。我正在編寫下面的 shell 腳本並期待提到的輸出。
#!/bin/bash python3 print("Hello World") exit() echo "The execution is completed"
我期望的輸出是,它應該進入python3解釋器並執行
exit()
命令,並且在執行exit()
命令後,如果我們手動執行,解釋器退出,然後執行echo
命令。但是在執行後python3
它不能那樣工作正在進入 python3 解釋器但不執行exit()
。>>>
它正確輸入了python3,然後停在那裡,直到我手動退出python解釋器。
為了獲得預期的輸出,我應該進行哪些更改。
- 後續問題:是否可以
Hello world
將 python 解釋器中生成的輸出或任何其他輸出獲取到 bash 環境並在 bash 腳本中使用它。2.您指定執行python命令的方法是否也適用於其他工具?
#!/bin/bash python3 print("Hello World") exit() echo "The execution is completed"
腳本的工作方式與直接在終端中鍵入命令不同,即。你想做的事情不會那麼容易。
該
#!/bin/bash
行告訴核心它試圖啟動的程序是一個需要執行的腳本/bin/bash
。因此,當您執行./scriptname
核心而不是執行時/bin/bash ./scriptname
,bash 將從scriptname
標準輸入(終端)而不是標準輸入中讀取命令。當 bash 到達該
python
行時,它將啟動 Python 解釋器並請等待它退出,然後再繼續下一行。當 Python 啟動時,它會執行與您在終端中鍵入時相同的python
操作,它將啟動互動式解釋器。Python 不知道你想從腳本文件中執行命令,你也不能告訴它跳過幾行。
當 Python 退出時,bash 將從下一行繼續,
quit()
這是一個語法錯誤,你也不能告訴 Bash 跳過python
.有三種方法可以讓 Python 執行命令:
- 通過heredoc (*1) 讓bash 將命令寫入python 的輸入。如果您這樣做,Python 將無法從終端讀取使用者輸入。
- 使用該
-c
選項提供一個簡短的命令列表。這僅適用於也不需要使用任何引號(用於字元串)的極短程序。多個命令可以用分號分隔。- 有一個單獨的 Python 腳本,這需要第二個文件。如果您了解與臨時文件相關的安全風險 (*2),您可以根據需要讓 bash 為您創建文件。只是不要在其中創建文件
/tmp
,你應該沒問題。後續問題:是否可以將輸出 Hello world 或 python 解釋器中生成的任何其他輸出獲取到 bash 環境並在 bash 腳本中使用它。
您可以使用
$(
and使用命令替換)
,請在雙引號字元串中使用這些。您甚至可以在內部嵌套雙引號字元串:test="$(python -c "import sys; print(sys.version)")" echo "Python has finished" echo "test = $test"
您指定執行 python 命令的方法是否也適用於其他工具?
上面列出的所有三種方法也適用於許多其他腳本語言。
*1 Heredoc 範例
read -p "How many numbers: " n python <<END for i in range($n): print(i) print("Literal dollar sign \$") END
該
<<END
語法使 shell (bash) 讀取所有行,直到它讀取單詞END
. 注意END
必須在行首。這樣你就不需要轉義引號。shell 仍將解釋美元符號,因此您可以使用變數。如果你想要一個實際的美元符號,你需要像這樣逃避它
\$
。*2 臨時文件的危險範例。不要使用此程式碼
cat >/tmp/python-script <<END for i in range(10): print(i) END python /tmp/python-script
如果其他人
/tmp/python-script
先創建,如果覆蓋文件失敗,這個 shell 腳本甚至不會停止。系統上的惡意使用者可能會創建一個有害的 Python 腳本,該腳本將執行而不是預期的腳本。這不是唯一可能出錯的事情。
有一些方法可以安全地執行此操作,但最簡單的方法是在目前工作目錄或主目錄的專用目錄中創建文件。
cat >dopythonstuff <<END ... END python dopythonstuff rm dopythonstuff