Я подозреваю, что проблема здесь в том, что foo = bar
- это присваивание (то же самое, что activate = false
), а синтаксический анализатор оболочки назначает как побочный эффект условного оператора. Всегда используйте [
в коде ZSH вместо Bourne [
], а вместо foo = bar
следует использовать пробелы, чтобы отличать тест от присваивания:
activated=false
function test_toggle() {
if [[ $activated = false ]]; then
echo "WAS FALSE"
activated=true
else
echo "WAS TRUE"
activated=false
fi
}
Результат :
% exec zsh
% which test_toggle
test_toggle () {
if [[ $activated = false ]]
then
echo "WAS FALSE"
activated=true
else
echo "WAS TRUE"
activated=false
fi
}
% echo $activated
false
% test_toggle
WAS FALSE
% test_toggle
WAS TRUE
% test_toggle
WAS FALSE
%
почему бы просто не перенаправить stderr
?
$ wget -i test.txt 2> wget-fail.log
$ cat wget-fail.log
--2016-11-15 22:06:50-- http://failing-host.com/
Auflösen des Hostnamen »failing-host.com (failing-host.com)«... fehlgeschlagen: Der Name oder der Dienst ist nicht bekannt.
wget: kann die Host-Adresse »failing-host.com« nicht auflösen
[править]
У меня есть функция ведения журнала, настроенная в сценарии bash для создания журнала, в котором сохраняются как stdout, так и stderr. Простое использование 2>, похоже, создает файл журнала с таким же огромным количеством информации в нем, включая успешные загрузки. Я мог бы подойти к проблеме с точки зрения синтаксического анализа файла журнала, ...
нет необходимости в синтаксическом анализе:
$ cat wget.sh
#!/bin/bash
echo log to stdout
echo >&2 log to stderr
wget -i test.txt 2> wget-fail.log
$ sh wget.sh &> script.log
$ cat script.log
log to stdout
log to stderr
$ cat wget-fail.log
--2016-11-15 23:02:00-- http://failing-host.com/
Auflösen des Hostnamen »failing-host.com (failing-host.com)«... fehlgeschlagen: Der Name oder der Dienst ist nicht bekannt.
wget: kann die Host-Adresse »failing-host.com« nicht auflösen