У меня есть скрипт 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 или если он запущен пользователем, у которого нет прав на копирование туда.