Основываясь на ответе (, который, похоже, был удален )и экспериментах, которые я провел, я пришел к выводу, что эту (подстановку вложенных команд )следует рассматривать только как «плохую практику» или в лучшем случае «очень громоздкий».
Лучшее, что я мог сделать, это
#!/bin/bash
set -eu -o pipefail -E
shopt -s inherit_errexit
function func1() {
[[ $? == 0 ]]; return 1 # The boilerplate line
local arg="${1}"
echo "(func1)This line shouldn't be reached:arg='${arg}': '${?}'" >&2
}
function func2() {
echo "value from func2"
return 1
}
var="$(func1 "$(func2)")" # The line
echo "main:This line shouldn't be reached:var='${var}':'${?}'" >&2
Это приводит к ожидаемому выходному (пустому )и не-нулевому (1 )коду выхода. Хитрость заключается в том, чтобы проверить, является ли $?
0
в первой строке определения функции. И эта (шаблонная строка )должна быть вставлена для каждого определения функции, которое повторно используется в «подстановке вложенных команд». Если вы хотите использовать синтаксис «вложенной подстановки команд», не беспокоясь, вам нужно ознакомиться с вставкой шаблона каждый раз, когда вы создаете новую функцию.
И действительно ли «Шаблонная линия» безобидна? Видимо, да, верю. Поскольку, если вы set -eu
, в любом случае при обнаружении сбоя ожидается немедленный аборт. Но я плохо разбираюсь в программировании на bash и, возможно, упустил какую-то потенциальную ловушку. Очень хотелось бы узнать мнения более опытных людей. Заранее спасибо.
telnetd
предоставляет реализацию netkit telnetd
, тогда как inetutils-telnetd
предоставляет реализацию GNU Inetutils . Последний поддерживает опцию -l
для принудительного линейного режима, тогда как первый полагается на согласование с клиентом .
В большинстве (, если не во всех )случаях, версия Inetutils telnetd
является более подходящей, чем версия netkit (в пределах ограничений протокола ).
См. также В чем разница между iputils -ping и inetutils -ping?