Обе эти команды, имеющие одинаковый результат, имеют смысл:
$ if 1; then printf "success\n"; else printf "failure\n"; fi
-bash: 1: command not found
failure
$ if $(printf 1); then printf "success\n"; else printf "failure\n"; fi
-bash: 1: command not found
failure
, поскольку $(printf "1")
печатает 1
до того, как 1
будет выполнено в if
.
Учитывая, что, однако, я не понимаю, почему они дают разные результаты:
$ if ""; then printf "success\n"; else printf "failure\n"; fi
-bash: : command not found
failure
$ if ; then printf "success\n"; else printf "failure\n"; fi
-bash: syntax error near unexpected token `;'
$ if $(printf ""); then printf "success\n"; else printf "failure\n"; fi
success
Почему вывод нулевой строки с помощью $(printf "")
будет обрабатываться иначе, чем нулевая строка, явно закодированная как ""
в первой команде или отсутствующий аргумент из второй команды? Что именно выполняется в последней команде и, как выясняется, успешно и почему?
Обновление - убедитесь, что я его получу!
Поэтому, применяя ответ @ chepner к приведенным выше сценариям, я добавил пояснения (пожалуйста, исправьте меня, если я что-то не так):
$ if 1; then printf "success\n"; else printf "failure\n"; fi
-bash: 1: command not found
failure
Оболочка анализирует if 1;
, видит что-то, что она ожидает от команды, но на самом деле это число 1
и поэтому не может "команда не найдена"
$ if $(printf 1); then printf "success\n"; else printf "failure\n"; fi
-bash: 1: command not found
failure
Оболочка анализирует if $(printf 1);
, видит что-то, что она ожидает от команды, $(printf 1)
, успешно выполняет ее, которая выдает 1. Оболочка видит, что что-то было выведено (1
) и выдает любой вывод в этом контексте оболочка ожидает, что «что-то» также будет командой, которую она должна выполнить, но на самом деле это число 1, и поэтому не может «команда не найдена».
$ if ""; then printf "success\n"; else printf "failure\n"; fi
-bash: : command not found
failure
Оболочка анализирует if "";
, видит что-то, что она ожидает от команды, но на самом деле это строка "" и поэтому не удается "команда не найдена"
$ if ; then printf "success\n"; else printf "failure\n"; fi
-bash: syntax error near unexpected token `;'
Оболочка выполняет синтаксический анализ if ;
, не находит команду, которую должна найти в этом контексте, и поэтому не может выполнить "синтаксическую ошибку"
$ if $(printf ""); then printf "success\n"; else printf "failure\n"; fi
success
Оболочка анализирует if $(printf "");
, видит что-то, что она ожидает от команды, $(printf "")
, успешно выполняет ее, и ничего не выводит, что оболочка принимает как таковую, и поэтому не имеет новой команды для выполнения, и поэтому применяет выход из успеха состояние последней команды, которую она выполнила ($(printf "")
) для условия в целом и, таким образом, успешно выполняет.