如何防止腳本在apt-get之後不停止?

如何防止腳本在apt-get之後不停止?

我保留了一些 bash 片段,並在需要管理時複製並貼上它們。但我發現apt-get取消腳本執行。這是我的腳本有問題的地方。

apt-get -y install gcc g++ make cmake perl

cd ~/
mkdir t1
cd t1

我在 OS X 終端機上將此腳本複製並貼上到 Ubuntu 12.04 LTS 伺服器(在虛擬機器上全新安裝)腳本總是在apt-get完成後停止。

我使用這樣的帳戶運行此命令root

ssh user1@server

<password…>

sudo su

<password…>

apt-get -y install gcc g++ make cmake perl

cd ~/
mkdir t1
cd t1

這會是一個問題嗎?或者為什麼我的腳本在apt-get完成後停止,以及如何讓它繼續?

答案1

我遇到了同樣的問題,但對這裡的解決方案不太滿意,或者這些解決方案對我不起作用。我發現讓它運行的方法是向 apt-get 發送 NULL 輸入,以便它繼續工作。

它看起來像這樣:

apt-get -y install gcc g++ make cmake perl  < "/dev/null"

cd ~/
mkdir t1
cd t1

#newline

希望其他人也能用這個!不要忘記換行符,這樣最後一個指令也會被執行

答案2

首先,您沒有執行腳本。貼上一系列命令並不會產生腳本。正如 Jobin 的回答中所述,如果您實際使用腳本,則不會遇到此問題。

問題可能是您使用命令使輸入緩衝區超載,並希望 bash 是從輸入緩衝區讀取的下一個進程。有很多原因導致 apt-get 會從輸入緩衝區讀取數據,因此當它完成並返回到 bash 時什麼都沒有留下。

如果需要,您仍然可以貼上一系列命令,而無需費力複製或編寫腳本檔案並使其可執行。 (在許多情況下,建立腳本會浪費精力,例如,您必須在多台電腦上執行一組簡單的命令,而不能在同一台電腦上執行兩次。)

如果您貼上以分號分隔的一系列命令,則整個序列將輸入到 bash 中,並且無論 apt 對輸入緩衝區執行什麼操作都會繼續:

apt-get -y install gcc g++ make cmake perl; cd ~/; mkdir t1; cd t1

答案3

您不應該將腳本中的命令複製並貼上到終端上,腳本應該在終端上執行。第一種方法的問題是,一旦第一個命令及其末尾的換行符被貼上,apt-get 就會開始執行,這會阻止將更多命令貼上到終端上,因此它們不會被貼上到終端上。

若要執行腳本,請將命令寫入檔案run.sh(或任何您想要的名稱),如下所示:

#!/bin/bash
apt-get -y install gcc g++ make cmake perl

cd ~/
mkdir t1
cd t1

然後要在終端機上執行它,請鍵入bash run.shbash filename(將檔案名稱替換為您為腳本指定的名稱)。該腳本的第一行告訴您直接執行腳本時要使用哪個 shell(首先使用 使其可執行chmod +x filename),然後將腳本作為 運行/path/filename

答案4

apt-get即使安裝成功,有時也會以非零代碼退出。

這使得腳本停止。這是無稽之談和荒謬的,但我必須解決這個問題。我試圖透過用子腳本包裝 apt-get 區塊來強制它繼續,以便忽略退出程式碼。

set -e

bash << +END
apt-get -y install gcc g++ make cmake perl
exit 0
+END
echo $?

cd ~/
mkdir t1
cd t1

實際上,我預計內部bash將以非零代碼退出 - 因此外部腳本將退出級聯 - 但它沒有並且繼續執行。

相關內容