Automake

使用 sed(或任何其他實用程序)創建臨時腳本,以便立即創建腳本以就地執行

  • November 16, 2016

我使用sed更改現有文件中的文本和 Nano 來創建新文件。

我用這種方式更改文本sed,例如:

sudo sed -i 's/TESTING === "1"/TESTING === "0"/g' /etc/csf/csf.conf

有沒有辦法用它創建文件,而不需要進入 Nano 或 VI 並粘貼文本、授予權限然後執行?

通常我會這樣做cd ~ && nano script.sh && chmod +x script.sh && ./script.sh && rm -rf script.sh,然後將所有腳本內容粘貼到其中,然後保存並執行。

然而,這一次,我什至想自動化,只需將所有內容粘貼為一個輸入並在適當的位置執行它。

換句話說,我尋找一種從粘貼執行腳本的方法,或者將其粘貼到臨時文件中並在我關閉文件時“就地”執行它,然後以最少的數量執行它點擊和粘貼。


為什麼我需要這個解決方案:

在使用多個伺服器環境時,該過程可能會重複,我想在一次又一次地執行此任務時節省時間。

關於這種行動的合法性的討論本身就是一個粗暴的討論……


這是一個範例 — 我粘貼以下 coomand 來提示(第一個,包括 & 號),進入 Nano 創建腳本,然後,我粘貼以下腳本語法,保存,它正在執行. 我希望通過一個粘貼/一個動作來自動化這個過程來完成所有這些。

cd /home/testo && sudo nano script.sh && sudo chmod +x scripts.sh && sudo ./script.sh

#!/bin/bash -x

# Basic update and upgrade:
sudo apt-get update -y
sudo apt-get upgrade -y

# Setup CSF-LFD:
sudo rm -f csf.tgz
sudo wget https://download.configserver.com/csf.tgz
sudo tar -xzf csf.tgz
sudo sh install.sh
sudo perl /etc/csf/csftest.pl
sudo sed -i 's/TESTING === "1"/TESTING === "0"/g' /etc/csf/csf.conf
sudo csf -r

換句話說,我尋找一種從 paste 執行腳本的方法,或者將其粘貼到臨時文件中並在不保存任何文件的情況下“就地”執行它 — 執行所有內容的點擊和粘貼次數最少.

假設您的互動式 shell 是 Bash 或兼容的 shell - 您正在尋找:

bash << 'EOT'

<PASTE SCRIPT HERE>

EOT

上面的程式碼實踐叫做“Heredoc”(“Here document”的縮寫),我用它在一個新的子shell中執行直到EOT的所有命令。

這樣,您可以更改工作目錄或更改環境。請注意,EOT 不是關鍵字,因此您可以使用任何您想要的片語來代替 EOT(只要確保 heredoc 的開頭和結尾的拼寫相同)。

周圍的單引號'EOT'用於指示父 shell不在heredocument 中執行任何替換。這可以防止例如由父 shell 而不是子 shell 進行的變數擴展。

作為一個具體的例子:

sylvain@bulbizarre:~$ bash << 'EOT'
echo hello
cd /
echo We are in ${PWD}
EOT

hello
We are in /
sylvain@bulbizarre:~$   # <-- I'm still in my home directory when
                       #     back to the interactive shell

換句話說,我尋找一種從粘貼中執行腳本的方法,或者將其**粘貼到臨時文件中並在不保存任何文件的情況下“就地”**執行 — 執行所有內容的點擊和粘貼次數最少.

如果要保留執行命令的副本,可以使用該變體:

sylvain@bulbizarre:~$ tee /tmp/saved.sh << 'EOT' | bash
echo hello
cd /
echo We are in ${PWD}
EOT

hello
We are in /

sylvain@bulbizarre:~$ cat /tmp/saved.sh 
echo hello
cd /
echo We are in ${PWD}

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