Альтернатива Makefile для тех, кто не хочет, чтобы табуляция делала отступ всего содержимого под средством открытия

Вы «отмечаете» панель:

-m и -M используются для установки и очистки отмеченной панели. Существует одна отмеченная панель за раз, установка новой отмеченной панели очищает последнюю. Отмеченная панель является целью по умолчанию для -s для объединения панели, панели подкачки и окна подкачки.

Некоторые действия теперь по умолчанию будут нацелены на отмеченную панель. Вот пример сценария bash для тестирования. Вы можете выполнить этот скрипт из сеанса tmux.

# /usr/bin/env bash
set -euo pipefail

# Make three vertically split windows with text in each.
tmux split-window -v
tmux split-window -v
tmux select-layout even-vertical
tmux send-keys -t 0 'echo pane zero' C-m
tmux send-keys -t 1 'echo pane one' C-m
tmux send-keys -t 2 'echo pane two' C-m

# You can now swap the current pane with an explicitly targeted pane. Here, we
# change pane ordering from 0-1-2 to 1-0-2, and back again.
tmux select-pane -t 0
tmux swap-pane -t 1
tmux swap-pane -t 1

# You can also swap panes by "marking" one and letting the target of the swap be
# implicit. Here, we change ordering from 0-1-2 to 1-0-2, and back again.
tmux select-pane -t 0
tmux select-pane -t 1 -m
tmux swap-pane
tmux swap-pane

Подробнее см. tmux(1).

1
15.05.2017, 06:15
4 ответа

Если это весь ваш Makefile и вы не отслеживаете какие-либо зависимости между файлами, просто используйте сценарий оболочки:

#!/bin/sh

for domain; do
> "/etc/apache2/sites-available/${domain}.conf" cat <<EOF
<VirtualHost *:80>
DocumentRoot "/var/www/html/${domain}"
ServerName "${domain}"
<Directory "/var/www/html/${domain}">
Options +SymLinksIfOwnerMatch
Require all granted
</Directory>
ServerAlias www.${domain}
</VirtualHost>
EOF
a2ensite "${domain}"
done

systemctl restart apache2.service

Скопируйте приведенное выше в файл с именем, например create- vhost, сделайте его исполняемым:

chmod 755 create-vhost

затем запустите его как

./create-vhost domain.tld

Это даже поддерживает создание файлов конфигурации нескольких виртуальных хостов (с одним перезапуском в конце):

./create-vhost domain1.tld domain2.tld
7
27.01.2020, 23:11

У меня есть "новейшая" функция bash, которая используется следующим образом:

newest ${target} ${dependencies} || {

         ${command} ${dependencies} > $target 
}

Она не анализирует скрипт, частью которого является; Я никогда не был поклонником функции "транзитивного закрытия" make, поэтому необходимо только упорядочить инструкции в "makefile".

Используются функции чуть более высокого уровня «bystdout» и «bycommand»

 bystdout ${target} ${command} ${dependencies}
 bycommand ${target} ${command} ${dependencies}

, где «bycommand» оборачивает те, чьи выходные данные могут быть выведены из зависимостей.

Когда-то я был достаточно сумасшедшим, чтобы написать анализируемый awk язык, который разворачивал вложенные зависимости:

 output ={ command }{ dependencies }.

это не такая уж большая задача.

1
27.01.2020, 23:11

Если вы используете GNU make, то вы можете с пользой использовать пользовательские функции и добиться желаемого:

# variables utilized
NULL :=
SPC  := $(NULL) $(NULL)
TAB  := $(NULL)$(shell printf '\t\n')$(NULL)

# macro to repeat a string ($2) ($1) times
_rep_str = $(if $(filter $1,$(words $3)),$(strip $3),$(call _rep_str,$1,$2,$3 $2))
rep_str  = $(subst $(SPC),$(NULL),$(subst x,$2,$(call _rep_str,$1,x)))

# TABs for depth of 1, 2, 3, ...
T1 := $(call rep_str,1,$(TAB))
T2 := $(call rep_str,2,$(TAB))
T3 := $(call rep_str,3,$(TAB))

# multiline macro to be used in recipes for generating .conf files
define create_conf
printf '%s\n' \
'<VirtualHost *:80>'                   \
'$(T1)DocumentRoot "/var/www/html/$@"' \
'$(T1)ServerName $@'                   \
'$(T1)<Directory "/var/www/html/$@">'  \
'$(T2)Options +SymLinksIfOwnerMatch'   \
'$(T2)Require all granted'             \
'$(T1)</Directory>'                    \
'$(T1)ServerAlias www.$@'              \
'</VirtualHost>' > $@
a2ensite "$@"
systemctl restart apache2.service
endef

# Now there are no leading TABs/spaces in the makefile

% :; @$(call create_conf)
1
27.01.2020, 23:11

Переменная .RECIPEPREFIX GNU Make (примечание: не специальная цель) может использоваться для изменения символа, который выделяет строки рецепта.

Например:

.RECIPEPREFIX=>
%:
>printf '%s\n' \
>'<VirtualHost *:80>' \
>'DocumentRoot "/var/www/html/$@"' \
>'ServerName $@' \
>'<Directory "/var/www/html/$@">' \
>'Options +SymLinksIfOwnerMatch' \
>'Require all granted' \
>'</Directory>' \
>'ServerAlias www.$@' \
>'</VirtualHost>' \
>> "$@"
>a2ensite "$@"
>systemctl restart apache2.service
10
27.01.2020, 23:11

Теги

Похожие вопросы