Это не прямое решение, но, похоже, вы можете использовать функцию on commit
в вашем файле конфигурации DHCP. Вот пример из этой статьи под названием: Выполнение сценария при передаче ISC DHCP новой аренды.
В файле dhcpd.conf
вы можете создавать действия на различные события, например, когда выдается аренда.
subnet 192.168.1.0 netmask 255.255.255.0 {
option routers 192.168.1.2;
on commit {
set clip = binary-to-ascii(10, 8, ".", leased-address);
set clhw = binary-to-ascii(16, 8, ":", substring(hardware, 1, 6));
execute("/usr/local/sbin/dhcpevent", "commit", clip, clhw, host-decl-name);
}
...
При запуске вышеприведенного скрипта, dhcpevent
, ему передается 4 аргумента.
execute_statement argv[0] = /usr/local/sbin/dhcpevent
execute_statement argv[1] = commit
execute_statement argv[2] = 192.168.1.40
execute_statement argv[3] = 11:aa:bb:cc:dd:ee
execute_statement argv[4] = d1.jp
clipw
и clhw
- переменные, в которых, в данном примере, части других метаданных были разобраны и сохранены до запуска скрипта. Эти переменные затем передаются вместе с другими элементами в сценарий события.
Вы могли бы использовать этот подход в сценарии, где вы могли бы отслеживать количество IP, которые были сданы в аренду, или, возможно, вы могли бы опросить фактический файл состояния аренды, который DHCP-сервер отслеживает эту информацию (/var/lib/dhcpd/dhcpd.leases
), а затем сообщить, если в этом файле есть количество аренд, превышающее вашу квоту.
По умолчанию глобусы оболочки упорядочены в лексикографическом порядке, а Zsh позволяет напрямую индексировать результаты глобусов, поэтому вы можете сделать что-то вроде этого:
cd2() {
cd -- */([2]); # indexing starts at one
}
В Bash вы можете сделать то же самое с массивом:
cd2() {
local dirs=(*/)
cd -- "${dirs[1]}" # indexing starts at zero
}
Оба по существу предполагают, что существует по крайней мере два совпадения с глобусом. См. ответ Кусалананды , чтобы узнать, как справиться с этим предположением.
Кроме того, если у вас есть ls
псевдоним, так что ему присвоены некоторые флаги, порядок сортировки может отличаться от порядка сортировки оболочек. (У меня есть ls
псевдоним ls -vF --color=auto
в Linux, -v
изменяет даже порядок сортировки a
и _
. )Zsh, конечно же, предоставит вам несколько других вариантов сортировки.
Обратите внимание, что хотя вы можете использовать что-то вроде ls | head -2 | tail -1
для получения второго имени файла в списке вывода ls
, это не работает для имен файлов с символами новой строки и требует не одного, а трех внешних процессы, чтобы сделать что-то, что оболочка может сделать сама, так что это не очень хорошее решение. ls */
еще глупее, так как здесь это оболочка , которая расширяет глобус, а ls
просто выводит полученные имена.См.https://mywiki.wooledge.org/ParsingLsдля получения дополнительной информации о том, как полагаться на вывод ls
может быть проблематично.
Используя zsh
, следующее будет cd
во второй каталог в текущем каталоге:
cd./*(/[2])
/
внутри круглых скобок является модификатором глобуса *
, который делает его совпадающим только с именами каталогов (см. руководство zshexpn
)и [2]
извлечь второй каталог, который этот глобус Спички.
Оборачиваем это в функцию:
cd2nd () { cd./*(/[2]); }
Обратите внимание, что это приведет вас к вашему домашнему каталогу, если в текущем каталоге нет второго каталога. Мы могли бы защититься от этого, сначала проверив, существует ли второй каталог:
cd2nd () { [ -d./*(/[2]) ] && cd./*(/[2]); }
Но теперь мы расширяем шаблон дважды .
В/bin/sh
(илиzsh
)с совпадением только одного универсального объекта:
cd2nd () { set --./*/; [ -d "$2" ] && cd "$2"; }
При этом используются позиционные параметры для хранения имен всех подкаталогов.(*/
Соответствуют только каталогам ), проверяется существование второго и выполняется переход к этому каталогу, если он существовал.
Функция, принимающая в качестве аргумента номер каталога, должна измениться на
function ff()
{
cd "$(ls -d */ | head -n $1 | tail -n 1)";
}
user@localhost:~ $ ff 2
user@localhost:~/Desktop $
ls -d */
список всех каталогов в текущем каталоге head -n $1
перечисляет только $1
первые каталоги, а $1
является аргументом нашей функции, поэтому, если вы вызовете cc 2
, тогда $1
примет значение2
(первые две строки сейчас обрабатываются ). tail -n 1
выбирает только последнюю строку cd
, поэтому каталог изменяется на правильный (кавычки присутствуют, поэтому имена каталогов с пробелами будут анализироваться как один аргумент)Эта версия предполагает, что с вводом все в порядке. Вы должны проверить ввод (как от пользователя, так и из списка каталогов файловой системы ), чтобы избежать непредвиденных ошибок в будущем.