blockquote>
+
для следующего брата. Есть ли эквивалент для предыдущего брата?Вы можете использовать два селектора ax :
!
и?
Там 2 следующие селекторные функции для сиблинга в обычном CSS:
+
является непосредственным последующим селектором сиблинга~
является любым последующим селектором сиблинга. В обычном CSS нет предыдущего селектора sibling.
Однако в ax CSS послепроцессорной библиотеки есть 2 предыдущие селекторные функции:
?
- это предыдущий селектор немедленного (напротив+
)!
является любым предыдущим селектором (см.~
)Рабочий пример:
В следующем примере:
.any-subsequent:hover ~ div
выбирает любой последующийdiv
.immediate-subsequent:hover + div
выбирает немедленный последующийdiv
.any-previous:hover ! div
выбирает любой предыдущийdiv
.immediate-previous:hover ? div
выбирает непосредственный предыдущийdiv
div { display: inline-block; width: 60px; height: 100px; color: rgb(255, 255, 255); background-color: rgb(255, 0, 0); text-align: center; vertical-align: top; cursor: pointer; opacity: 0; transition: opacity 0.6s ease-out; } code { display: block; margin: 4px; font-size: 24px; line-height: 24px; background-color: rgba(0, 0, 0, 0.5); } div:nth-of-type(-n+4) { background-color: rgb(0, 0, 255); } div:nth-of-type(n+3):nth-of-type(-n+6) { opacity: 1; } .any-subsequent:hover ~ div, .immediate-subsequent:hover + div, .any-previous:hover ! div, .immediate-previous:hover ? div { opacity: 1; }
<h2>Hover over any of the blocks below</h2> <div></div> <div></div> <div class="immediate-previous">Hover for <code>?</code> selector</div> <div class="any-previous">Hover for <code>!</code> selector</div> <div class="any-subsequent">Hover for <code>~</code> selector</div> <div class="immediate-subsequent">Hover for <code>+</code> selector</div> <div></div> <div></div> <script src="https://rouninmedia.github.io/axe/axe.js"></script>
В вашем примере установлена переменная TMP
(и временный каталог создан) всякий раз, когда оцениваются правила для out.tar
. Чтобы создать каталог только тогда, когда out.tar
действительно запущен, вам нужно переместить создание каталога вниз на следующие шаги:
out.tar :
$(eval TMP := $(shell mktemp -d))
@echo hi $(TMP)/hi.txt
tar -C $(TMP) cf $@ .
rm -rf $(TMP)
Функция eval оценивает строку, как если бы он был введен в make-файл вручную. В этом случае, он устанавливает переменную TMP
в результат вызова функции оболочки
.
редактировать (в ответ на комментарии):
Чтобы создать уникальную переменную, вы мог бы сделать следующее:
out.tar :
$(eval $@_TMP := $(shell mktemp -d))
@echo hi $($@_TMP)/hi.txt
tar -C $($@_TMP) cf $@ .
rm -rf $($@_TMP)
Это добавило бы к переменной имя цели (в данном случае out.tar), создав переменную с именем out.tar_TMP
. Надеюсь, этого достаточно для предотвращения конфликтов.
Мне не нравится, "не Делают" ответов, но... не делают.
make
переменные глобальны и, как предполагается, оценены во время этапа "парсинга" make-файла, не во время этапа выполнения.
В этом случае, пока переменная, локальная для единой цели, следуют ответ @nobar и делают это переменной оболочки.
Целевые переменные также считает вредными другой делающему реализации: kati, Mozilla pymake. Из-за них цель может быть создана по-другому в зависимости от того, если она создала автономный, или как зависимость родительской цели с целевой переменной. И Вы не будете знать, каким путем это было , потому что Вы не знаете то, что уже создается.