Записать содержимое в файл с помощью скрипта bash - PullRequest
1 голос
/ 18 марта 2019

Я пытаюсь создать bash script для daemonized celeryd task. В моем скрипте bash мне нужно создать несколько файлов и добавить контент. Это содержимое имеет переменную, заданную пользователем с именем $app_name с read method и некоторыми другими переменными в содержимом.

Проблема:

Когда я копирую содержимое моего bash-скрипта по указанному пути, он не копирует переменные, уже присутствующие внутри.

Пример:

В моем скрипте bash у меня есть:

########################
# Get application name #
########################

read -p "Define the application name (lowercase and without spaces): " app_name
echo "You defined the application name: $app_name"

############################################################
# Create service file /usr/local/etc/rc.d/celeryd_app_name #
############################################################

cat > /usr/local/etc/rc.d/celeryd_$app_name << EOF
#!/bin/sh
# =====================================================
#  celeryd_$app_name - Starts the Celery worker daemon.
# =====================================================
#
# :Usage: /etc/init.d/celeryd_$app_name {start|stop|force-reload|restart|try-restart|status}
# :Configuration file: /etc/default/celeryd_$app_name

### BEGIN INIT INFO
# Provides:          celeryd_$app_name
# Required-Start:    $network $local_fs $remote_fs
# Required-Stop:     $network $local_fs $remote_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
### END INIT INFO
EOF

Но если я открою созданный файл, я получу:

### BEGIN INIT INFO
# Provides:          celeryd_$app_name
# Required-Start:    
# Required-Stop:     
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
### END INIT INFO

Не копирует $network $local_fs $remote_fs, которые присутствуют в контенте.

Есть еще один способ сделать это?

Спасибо!

1 Ответ

4 голосов
/ 18 марта 2019

Происходит следующее: here document расширяет переменные и, поскольку они не объявлены, вы получаете пустые значения из вики:

По умолчанию поведение в значительной степени идентично содержанию двойных кавычек: имена переменных заменяются их значениями, оцениваются команды внутри обратных кавычек и т. Д.

$ cat << EOF
> \$ Working dir "$PWD" `pwd`
> EOF
$ Working dir "/home/user" /home/user

Это можно отключить, заключив в кавычки любую часть метки, которая затем заканчивается значением без кавычек; поведение по существу идентично тому, что если содержимое было заключено в одинарные кавычки. Так, например, установив его в одинарные кавычки:

$ cat << 'EOF'
> \$ Working dir "$PWD" `pwd`
> EOF
\$ Working dir "$PWD" `pwd`

Итак, из вашего примера вы можете изменить ваш скрипт так, чтобы он был примерно таким:

#!/bin/sh

cat << 'EOF' > /usr/local/etc/rc.d/celeryd_$app_name
#!/bin/sh
# =====================================================
#  celeryd_$app_name - Starts the Celery worker daemon.
# =====================================================
#
# :Usage: /etc/init.d/celeryd_$app_name {start|stop|force-reload|restart|try-restart|status}
# :Configuration file: /etc/default/celeryd_$app_name
### BEGIN INIT INFO
# Provides:          celeryd_$app_name
# Required-Start:    $network $local_fs $remote_fs
# Required-Stop:     $network $local_fs $remote_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
### END INIT INFO
EOF

Который затем выдаст результат:

#!/bin/sh
# =====================================================
#  celeryd_$app_name - Starts the Celery worker daemon.
# =====================================================
#
# :Usage: /etc/init.d/celeryd_$app_name {start|stop|force-reload|restart|try-restart|status}
# :Configuration file: /etc/default/celeryd_$app_name
### BEGIN INIT INFO
# Provides:          celeryd_$app_name
# Required-Start:    $network $local_fs $remote_fs
# Required-Stop:     $network $local_fs $remote_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
### END INIT INFO
...