Bash

如何進入python環境並執行一些python命令並使用shell腳本返回普通終端

  • September 23, 2020

抱歉,標題可能不清楚。這是我懷疑的完整解釋。我正在編寫下面的 shell 腳本並期待提到的輸出。

#!/bin/bash
python3
print("Hello World")
exit()
echo "The execution is completed"

我期望的輸出是,它應該進入python3解釋器並執行printandexit()命令,並且在執行exit()命令後,如果我們手動執行,解釋器退出,然後執行echo命令。但是在執行後python3它不能那樣工作正在進入 python3 解釋器但不執行printand exit()

>>>

它正確輸入了python3,然後停在那裡,直到我手動退出python解釋器。

為了獲得預期的輸出,我應該進行哪些更改。

  1. 後續問題:是否可以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 執行命令:

  1. 通過heredoc (*1) 讓bash 將命令寫入python 的輸入。如果您這樣做,Python 將無法從終端讀取使用者輸入。
  2. 使用該-c選項提供一個簡短的命令列表。這僅適用於也不需要使用任何引號(用於字元串)的極短程序。多個命令可以用分號分隔。
  3. 有一個單獨的 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

引用自:https://unix.stackexchange.com/questions/610122