Поскольку я не смог понять, как обнаружить зависание с помощью имеющегося у меня оборудования, я создал программное -решение под названием HUPMon , написанное на C. In определяет, находится ли терминал в сети, отправляя сообщение о положении курсора (последовательность CPR )на терминал и ожидание ответа. Если ответ не получен, предполагается, что терминал находится в автономном режиме. Репозиторий включает скрипт и системный модуль, который можно использовать вместо agetty (8 ), который делает что-то похожее на этот скрипт:
stty 19200 sane -brkint ixoff -imaxbel
while :; do
if [ "$(hupmon -1)" = "DEVICE_ONLINE" ]; then
stty 19200 sane -brkint ixoff -imaxbel
printf "\033[r\033[H\033[J" # Clear the screen.
TERM="vt100" hupmon /bin/login
fi
sleep 1
done
Внутри функции, в sh
, позиционные параметры ($1
, $2
..., $@
,$*
)являются параметрами самой функции,позиционные параметры скрипта (или родительской функции, если они вызываются из другой функции ), становятся недоступными.
Таким образом, вам нужно передать эти аргументы в функцию каким-то другим способом.
Не помогает то, что sh
не поддерживает переменные-массивы, что затрудняет хранение произвольного списка строк.
Помимо решений, уже предложенных другими, вы можете:
#! /bin/sh -
myFunc() {
n="$(( $# - $1 - 1 ))" i=0; shift
for arg do
case "$i" in
("$n") break;;
(0) shift "$n";; # on first pass, remove the function arguments from "$@"
esac
i="$(( i + 1 ))"
#... do something with every "$arg" passed to myFunc and with "$@"
done
}
И зовите myFunc
как:
myFunc "$#" args for myFunc "$@"