Ваши команды не работают так, как вы ожидаете, потому что тест ничего не выводит в свой стандартный поток вывода. Это стандартный поток вывода, который передается следующей команде в конвейере (ваша первая команда ), и это стандартный вывод, который заменяет подстановку команд (вашу вторую команду ).
Кстати, обратите внимание, что даже если левая часть вашего первого конвейера выдает что-то в своем стандартном потоке вывода, echo
справа этого не отобразит. Утилита echo
не читает со своего стандартного ввода (, но, например. cat
делает ).
Любая команда оболочки возвращает статус выхода. Этот статус выхода - это то, что, например. действует оператор if
. Статус выхода никогда не выводится, например. терминал, иначе это будет мешать фактическому выводу команды или сценария.
При использовании
[ 3 -gt 4 ]
вы вызываете утилиту [
с некоторыми аргументами. Эта утилита возвращает статус выхода. Это в точности эквивалентно
test 3 -gt 4
См. man test
иman [
(или help test
в оболочке bash
).
Статус выхода самой последней выполненной команды сохраняется в специальной переменной $?
.
Вы можете сохранить это в обычной переменной или вывести на терминал:
[ 3 -gt 4 ]
printf 'Exit status of test was %s\n' "$?"
printf 'Exit status of printf was %s\n' "$?"
Обратите внимание, чтоprintf
также создает свой собственный статус выхода, поэтому, если вызов printf
прошел нормально, значение $?
будет равно нулю после вывода статуса теста.
Приведенный выше код, скорее всего, выведет
Exit status of test was 1
Exit status of printf was 0
Обратите внимание, что сам тест здесь никогда ничего не выводит. Он просто предоставляет статус выхода.
Это ошибка в fish, вызванная использованием символов, отличных от -ASCII, с языковым стандартом, не поддерживающим -Unicode.
Установите для вашей локали что-то, что может обрабатывать UTF -8 (, т. е. не "C" по умолчанию)