如何让 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 会扩展 $ 变量、反斜杠、反引号和各种内容。因此,一般尽可能使用单引号。

但是,在单引号内不能轻易使用单引号,而在单引号内使用双引号则很容易。

在双引号内使用双引号,但必须用反斜杠转义。因此echo "abc\"def\""输出abc"def"

在双引号内也可以使用单引号,但它们不会阻止所有扩展。因此echo "abc'def'"打印abc'def'

您可以在单引号内使用单引号,但必须输入: echo 'abc'\''def'\''hij'打印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 运行的,或者由没有权限复制到那里的用户运行的。

相关内容