следующего, если/то тест (в Баше):тройной конструкция не эквивалентны, если потом еще
if [ 1 ]; then ls /undef_dummy > /dev/null 2>&1; else echo "else stmt"; fi
кажется не эквивалентен его троичная версия:
(test 1) && ls /undef_dummy > /dev/null 2>&1 || echo "else stmt"
Первым будет печатать ничего но второй будет печатать «else stmt».
Это потому, что || оператор в тернарной версии относится к состоянию возврата либо теста , либо команды, выполняемой, если тест проходит. Но обычно мы хотим, чтобы оператор else касался только теста, поэтому здесь небезопасно использовать тернарную версию.
Я прав?
Почему вы называете второй вариант «тройным»? Я не думаю, что 'x && y || z' является тройным в смысле C 'x? y: z' тройной оператор. Это всего лишь состав двух бинарных операторов. И тогда приоритет решает результат. –
вы всегда можете выполнить '(test 1) && (ls ... || true) || echo "else stmt" ' – bobah
Я, вероятно, должен был сказать« порядок оценки »вместо« приоритета ». –