Если я правильно вас понял, вы ищете все имена файлов, которые существуют с каждым из целевых расширений. Если это так, вы можете сделать:
( shopt -s nullglob;
for i in *.wed; do
set -- "${i//.wed}"{.tis,.are,LM.bmp}*;
[[ $# -eq 3 ]] && printf '%s\n' "${i//.wed}";
done )
shopt -s nullglob
: это специфическая для bash опция, которая заставляет глобусы расширяться до нулевой строки вместо себя, если не найдено ни одного подходящего файла. ( )
здесь только для того, чтобы гарантировать, что опция будет установлена только для этой команды и не повлияет на родительскую оболочку. for i in *.wed; do ...; done
: перебирает все файлы или каталоги в текущем каталоге, имя которых заканчивается на .wed
, сохраняя каждый из них как $i
. "${i//.wed}"
: имя файла без расширения .wed
. set -- "${i//.wed}"{.tis,.are, LM.bmp}*
: скобки расширяются до foo.tis
, foo.are
и т.д., а *
- это трюк, чтобы заставить bash попытаться сопоставить их как глобы. Это означает, что он сработает только в том случае, если фактическое имя файла существует. [[ $# -eq 3 ]] && printf '%s\n' "${i//.wed}"
: если в $@
находится ровно 3 файла, то есть 3 в дополнение к исходному .wed
, выведите имя файла без расширения. Если вы хотите вывести все 4 имени файла, включая расширение, просто измените printf '%s\n' "${i//.wed}"
на printf '%s\n' "$i"
.
Поиск login.defs
или LOGIN_TIMEOUT
действительно не дает релевантных результатов, а при просмотре loginutils / login.c действительно кажется, что значение и все таймер жестко запрограммирован:
enum { TIMEOUT = 60, EMPTY_USERNAME_COUNT = 10, / * Некоторые пользователи обнаружили, что ограничение в 32 символа слишком мало: * / USERNAME_SIZE = 64, TTYNAME_SIZE = 32, };
[…]
static void alarm_handler (int sig UNUSED_PARAM) { / * Это аварийный люк! Бедные пользователи последовательной линии и тому подобное * прибывают сюда, когда их соединение обрывается. * Мы не хотим блокировать здесь * / ndelay_on (STDOUT_FILENO); {{1 }} / * Проверка правильности восстановления attr: * запустить "getty 0 -" из оболочки, ввести поддельное имя пользователя, остановиться на запросе пароля *, подождать время ожидания. Без приведенного ниже tcsetattr *, когда вы вернетесь к приглашению оболочки, эхо будет по-прежнему отключено. * / tcsetattr_stdin_TCSANOW (& G.tty_attrs); printf ("\ r \ nLogin time out after% u seconds \ r \ n", TIMEOUT); fflush_all (); / * unix API - это мозг поврежден в отношении O_NONBLOCK, * мы должны отменить его, иначе мы можем повлиять на другие процессы * / ndelay_off (STDOUT_FILENO); _exit (EXIT_SUCCESS); }
[…]
int login_main (int argc, char ** argv) MAIN_EXTERNALLY_VISIBLE; int login_main (int argc UNUSED_PARAM, char ** argv) {
[…]
/ * Мы устанавливаем только обработчик тайм-аута _после_ сохранения G.tty_attrs * / signal (SIGALRM, alarm_handler); alarm (TIMEOUT);
Обратите внимание, что последняя часть не с отступом кажется, что вокруг него нет if
, поэтому он всегда выполняется. Возможно, вы могли бы раскомментировать последние две строки и заново скомпилировать busybox
, если это возможно.
Из примера inittab busybox :
# <action>: Valid actions include: sysinit, respawn, askfirst, wait, once,
# restart, ctrlaltdel, and shutdown.
#
# Note: askfirst acts just like respawn, but before running the specified
# process it displays the line "Please press Enter to activate this
# console." and then waits for the user to press enter before starting
# the specified process.
Таким образом, вы можете просто изменить respawn
на askfirst
. Таким образом, / bin / login
по истечении тайм-аута просто вернется к приглашению Пожалуйста, нажмите Enter…
вместо того, чтобы сразу снова запустить / bin / login
.
Как вы заметили, программа входа в систему
может быть и обычно настроена на тайм-аут, если в течение определенного количества секунд не поступает никаких входных данных. У такого поведения есть различные мотивы, начиная от желания держать неиспользуемые коммутируемые линии свободными до , когда мир хочет, чтобы вы очистили свой экран . В равной степени есть причины не хотеть этого, как и у вас здесь. Во-первых, вешать трубку, чтобы очистить линию, бессмысленно, если нет модема.
К сожалению, программы входа
различаются в этом отношении. логин
из (скажем) пакета входа в Debian учитывает конфигурационный файл /etc/login.defs
. У меня для параметра LOGIN_TIMEOUT
установлено значение 0. Но другие программы входа в систему
имеют это неконфигурируемое и жестко запрограммированное. В мире существует не только одна программа входа в систему
. ☺
Программа login
во FreeBSD - увы! - один такой. То же самое можно сказать о программе входа в систему
, которая встроена в Busybox. В первом случае тайм-аут составляет 300 секунд; последнее, всего за 60 секунд .
Код Busybox - это константа времени компиляции. Вам придется фактически изменить исходный код программы и перестроить его, чтобы отключить такое поведение. Согласно комментарию в коде программы FreeBSD login
, который объясняет, почему это переменная времени выполнения, а не константа времени компиляции, авторы FreeBSD ожидают, что вы измените это, исправив / usr / bin / login
сам двоичный файл.
Есть несколько смягчающих стратегий. Один - увы! - сохранить getty
в цикле. Вход FreeBSD
вызывается FreeBSD getty
, у которого есть возможность -
в / etc / gettydefs
, которая обычно равна нулю. getty
Busybox аналогично имеет параметр -t
. Оба означают, что незанятый, не авторизованный последовательный терминал постоянно находится в приглашении login:
, отображаемом getty
, и тайм-аут в login
не начинается.
Я сам не использую getty
на виртуальных терминалах. Итак, для FreeBSD у меня есть очень простая программа с приглашением входа в систему
, которая просто ждет, пока пользователь нажмет клавишу возврата. А в Linux я выключаю тайм-аут с помощью login.defs
, как упоминалось.
Однако для реальных терминалов на последовательных линиях я все еще использую getty
.