Как заставить скрипт 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

Внутри одинарных кавычек оболочка обрабатывает данные без изменений. Внутри двойных кавычек оболочка расширяет $переменные, обратную косую черту, обратные кавычки и все такое. Поэтому обычно используйте одинарные кавычки, где это возможно.

Однако внутри одинарных кавычек использовать одинарные кавычки не так-то просто, тогда как двойные кавычки внутри одинарных использовать легко.

Внутри двойных кавычек выможетиспользуйте двойные кавычки, но вы должны экранировать их обратной косой чертой. Так что 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 или если он запущен пользователем, у которого нет прав на копирование туда.

Связанный контент