我有一個 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 運行的,或者是由無權在那裡複製的用戶運行的)。