我保留了一些 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.sh
或bash 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
將以非零代碼退出 - 因此外部腳本將退出級聯 - 但它沒有並且繼續執行。