Tengo un script bash. Quiero que este script se vuelva a crear en /usr/local/bin sin necesidad de un archivo adicional para hacerlo.
bash_a.sh:
ssh -t -t server-a.com "
cd /var/
irb
..etc
"
Estaba pensando algo así:
echo "
ssh -t -t server-a.com "
cd /var/
irb
..etc
"
" > /usr/local/bin/bash_a.sh
O esto:
cp bash_a.sh /usr/local/bin/bash_a.sh
ssh -t -t server-a.com "
cd /var/
irb
..etc
"
Respuesta1
Pruebe el truco de las comillas simples y dobles para su sugerencia:
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 comillas simples, el shell maneja los datos sin cambios. Entre comillas dobles, el shell expande $variables, barras invertidas, comillas invertidas y todo tipo de cosas. Por lo tanto, utilice comillas simples siempre que sea posible.
Sin embargo, dentro de comillas simples no se pueden usar comillas simples fácilmente, mientras que las comillas dobles dentro de comillas simples son fáciles.
Dentro de comillas dobles túpoderUtilice comillas dobles, pero debe utilizar una barra invertida para escapar de ellas. Entonces echo "abc\"def\""
impresiones abc"def"
.
Dentro de comillas dobles también puedes usar comillas simples, pero no detienen toda esa expansión. Entonces echo "abc'def'"
impresiones abc'def'
.
Puede utilizar comillas simples dentro de comillas simples, pero debe escribir:
echo 'abc'\''def'\''hij'
which prints abc'def'hij
.
Respuesta2
Usando la respuesta en¿Puede un script Bash saber en qué directorio está almacenado?:
#!/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
Esto if
evita que el script intente copiarse a sí mismo si se ejecuta desde /usr/local/bin o si lo ejecuta un usuario que no tiene permiso para copiar allí.