![如何让 bash 脚本将其自身回显到新文件中?](https://linux22.com/image/1457770/%E5%A6%82%E4%BD%95%E8%AE%A9%20bash%20%E8%84%9A%E6%9C%AC%E5%B0%86%E5%85%B6%E8%87%AA%E8%BA%AB%E5%9B%9E%E6%98%BE%E5%88%B0%E6%96%B0%E6%96%87%E4%BB%B6%E4%B8%AD%EF%BC%9F.png)
我有一个 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 会扩展 $ 变量、反斜杠、反引号和各种内容。因此,一般尽可能使用单引号。
但是,在单引号内不能轻易使用单引号,而在单引号内使用双引号则很容易。
在双引号内能使用双引号,但必须用反斜杠转义。因此echo "abc\"def\""
输出abc"def"
。
在双引号内也可以使用单引号,但它们不会阻止所有扩展。因此echo "abc'def'"
打印abc'def'
。
您可以在单引号内使用单引号,但必须输入:
echo 'abc'\''def'\''hij'
打印abc'def'hij
。
答案2
#!/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 运行的,或者由没有权限复制到那里的用户运行的。