Como faço para que um script bash ecoe em um novo arquivo?

Como faço para que um script bash ecoe em um novo arquivo?

Eu tenho um script bash. Quero que esse script se recrie em /usr/local/bin sem precisar de um arquivo adicional para fazer isso.

bash_a.sh:

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

Eu estava pensando em algo do tipo:

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

Ou isto:

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

Responder1

Experimente o truque das aspas simples e duplas para sua sugestão:

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

Entre aspas simples, o shell trata os dados inalterados. Dentro de aspas duplas, o shell expande variáveis ​​$, barra invertida, crases e todo tipo de coisa. Portanto, geralmente use aspas simples sempre que possível.

No entanto, dentro de aspas simples você não pode usar aspas simples facilmente, enquanto aspas duplas dentro de aspas simples são fáceis.

Entre aspas duplas vocêpodeuse aspas duplas, mas você deve escapá-las com barra invertida. Então echo "abc\"def\""imprime abc"def".

Dentro das aspas duplas você também pode usar aspas simples, mas elas não impedem toda essa expansão. Então echo "abc'def'"imprime abc'def'.

Você pode usar aspas simples dentro de aspas simples, mas precisa digitar: echo 'abc'\''def'\''hij'which prints abc'def'hij.

Responder2

Usando a resposta emUm script Bash pode dizer em qual diretório está armazenado?:

#!/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

Isso ifevita que o script tente se copiar, ele está sendo executado em /usr/local/bin ou se estiver sendo executado por um usuário que não tem permissão para copiar lá.

informação relacionada