У меня есть скрипт 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
"

2 ответа2

2

Попробуйте трюк с одинарными и двойными кавычками для вашего предложения:

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 .

1

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .