如何讓 bash 腳本將自身回顯到新檔案中?

如何讓 bash 腳本將自身回顯到新檔案中?

我有一個 bash 腳本。我想讓這個腳本在 /usr/local/bin 中重新建立自身,而不需要額外的檔案來執行此操作。

bash_a.sh:

ssh -t -t server-a.com "
cd /var/
irb
..etc
"

我在想一些事情:

echo "
ssh -t -t server-a.com "
cd /var/
irb
..etc
"
" > /usr/local/bin/bash_a.sh

或這個:

cp bash_a.sh /usr/local/bin/bash_a.sh
ssh -t -t server-a.com "
cd /var/
irb
..etc
"

答案1

試著使用單引號和雙引號技巧來表達您的建議:

echo '#!/bin/bash
ssh -t -t server-a.com "
cd /var/
irb
..etc
"
' > /usr/local/bin/bash_a.sh
chmod a+rx /usr/local/bin/bash_a.sh

在單引號內,shell 會照原樣處理資料。在雙引號內,shell 擴展 $variables、反斜線、反引號和各種內容。所以一般情況下盡量使用單引號。

但是,在單引號內不能輕鬆使用單引號,而在單引號內使用雙引號則很容易。

雙引號內你使用雙引號,但必須使用反斜線轉義它們。所以echo "abc\"def\""列印abc"def"

在雙引號內,您也可以使用單引號,但它們不會阻止所有擴充功能。所以echo "abc'def'"列印abc'def'

您可以在單引號內使用單引號,但必須輸入: echo 'abc'\''def'\''hij'which 列印abc'def'hij

答案2

使用中的答案Bash 腳本可以告訴它儲存在哪個目錄中嗎?:

#!/bin/bash
DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
BINDIR=/usr/local/bin
if [[ $DIR != $BINDIR && -w $BINDIR ]]
then
    cp "${BASH_SOURCE[0]}" $BINDIR
fi
... rest of script

if可以防止腳本嘗試複製自身(它是從 /usr/local/bin 運行的,或者是由無權在那裡複製的用戶運行的)。

相關內容