Давайте добавим еще один отладочный код.
all: $TARGETS
define f2
$$(info f2 called on $(1))
.PHONY: target$(1)
target$(1):
echo "We are in $(1)"
TARGETS+=target$(1)
endef
define f1
VAR$(1)=ValueWith$(1)
$(info too early: VAR$(1) is $$(VAR$(1)))
$$(info right time: VAR$(1) is $$(VAR$(1)))
$(eval $(call f2,$(VAR$(1))))
endef
$(eval $(call f1,CallOne))
$(eval $(call f1,CallTwo))
$(warning Warning: $(TARGETS))
Вывод:
too early: VARCallOne is $(VARCallOne)
f2 called on
right time: VARCallOne is ValueWithCallOne
too early: VARCallTwo is $(VARCallTwo)
f2 called on
debug.mk:18: warning: overriding commands for target `target'
debug.mk:17: warning: ignoring old commands for target `target'
right time: VARCallTwo is ValueWithCallTwo
debug.mk:20: Warning: target target
make: *** No rule to make target `ARGETS', needed by `all'. Stop.
Проблема заключается в том, что вызов eval
выполняется перед определением VAR...
в момент расширения функции f1
, а не в момент обработки результата этого расширения. Необходимо отложить оценку
.
Также имеется опечатка в строке 1; если вы исправите его, вы обнаружите, что целевой объект все
ничего не строят, поскольку TARGETS
не определен во время его использования. Необходимо объявить зависимости позже.
all: # default target, declare it first
define f2
.PHONY: target$(1)
target$(1):
echo "We are in $(1)"
TARGETS+=target$(1)
endef
define f1
VAR$(1)=ValueWith$(1)
$$(eval $$(call f2,$$(VAR$(1))))
endef
$(eval $(call f1,CallOne))
$(eval $(call f1,CallTwo))
$(warning Warning: $(TARGETS))
all: $(TARGETS)
-121--290400- *
в узоры оболочки соответствует 0 или более символам. Не следует путать с оператором регулярного выражения *
, который означает 0 или более предшествующего атома .
В базовых узорах оболочки нет эквивалента regexp *
. Тем не менее, различные оболочки имеют расширения для этого.
ksh
имеет * (что-то)
:
ls a_ * ([a-z]) _data
можно использовать в bash
с shopt -s extglob
или zsh
с setopt kshglob
:
shopt -s extglob
ls a_ * ([a-z]) _data
В zsh
с включенным extendedglob
, #
эквивалентно regexp *
:
setopt extendedglob
ls a_[a-z]#_data
В последних версиях ksh93
также можно использовать регулярные выражения в глобусах. Здесь с расширенными регулярными выражениями:
ls ~ (E:a_[a-z]*_data)
Обратите внимание, что [a-z]
соответствует различным параметрам в зависимости от текущего языкового стандарта. Обычно он соответствует только 26 a
- z
латинским неакцентированным буквам в языковом стандарте C
. В других языках он обычно больше совпадает и не всегда имеет смысл. Чтобы соответствовать букве в вашем языковом стандарте, вы можете предпочесть [[: alpha:]]
.
~/.zshenv
загружается zsh при его запуске (за исключением случаев, когда начинается с -f
или если каталог конфигурации изменяется путем установки ZDOTDIR
). Он не загружен (не может быть понят) какой-либо другой оболочкой. Таким образом, упорядочение нагрузки ~/.zshenv
эквивалентно упорядочению заданий, выполняемых zsh. Установите переменную SHELL
в crontab; это относится ко всем должностям.
Остерегайтесь ставить вещи на .zshenv
, потому что он читается каждой оболочкой. Например, если задать переменную среды для выполнения некоторых программ в другой среде (например, вам нужны различные версии некоторых файлов или программ, поэтому необходимо задать некоторые переменные среды ... PATH
), это не будет работать, если .zshenv
переопределяет эти переменные.
Если требуется задать переменные среды для интерактивных сеансов и заданий cron, не используйте .zshenv
.Используйте файл, исходный из ~/.profile
и crontabs. Запустите каждое задание cron с помощью . ~/.my _ environment.sh;
(вы не можете сделать это глобально).
Выходные данные заданий cron отправляются по электронной почте с помощью средства локальной почты. Я не знаю, как это устроено на OSX. Вместо этого я не рекомендую использовать файл журнала, потому что cron заботится о том, чтобы отправить электронное письмо по заданию и не отправлять электронное письмо от успешных заданий (нет выходных данных, код возврата 0)). Если вы действительно хотите использовать файл журнала, запустите каждое задание с помощью команды exec > ~/cron-logs/nameofthisjob- $ (дата +\% Y\% m\% d-\% H\% M) 2 > & 1 &
.
Файловая система sysfs
, обычно монтируемая на /sys
, точно так же, как файловая система /proc
, не является типичной файловой системой, это так называемая псевдо файловая система . На самом деле он заполняется ядром, и вы не можете удалять файлы напрямую.
Итак, если поддержка ноутбуков ASUS вам не подходит, вам нужно попросить ядро удалить ее. Для этого снимите соответствующий модуль :
.sudo rmmod asus-laptop
Это приведет к удалению соответствующей записи /sys
.