Почему = ~ оператор дает синтаксическую ошибку на Solaris при сравнении с регулярным выражением

Единственная обязательная причина для перезагрузки - новое ядро ​​(и вы можете выполнить мягкую перезагрузку с помощью kexec). См. https://wiki.archlinux.org/index.php/Kexec для подробностей, вкратце:

  • загрузите новое ядро, initramfs и укажите командную строку загрузки

     kexec -l / boot / new-kernel --initrd = / boot / new-initramfs --reuse-cmdline 
     
  • вызвать kexec (используйте systemctl для правильного завершения работы, ] kexec -e будет выполняться напрямую)

     systemctl kexec 
     
  • Обратите внимание, что если вы создаете kexec-load @ .service , как описано в вики, если вы После перезагрузки systemd автоматически выполнит мягкую перезагрузку с использованием kexec вместо перезагрузки BIOS

Немного улучшенная версия, которая дает имена служб systemd:

PIDS="(lsof +c0 -n 2> /dev/null | grep 'DEL.*lib' | awk '{print $2}' | sort -u)"
for PID in $PIDS; do
    systemctl status $i
done | grep '●' | awk '{print $2}' | sort -u

или однострочное:

for i in $(lsof +c0 -n 2> /dev/null | grep 'DEL.*lib' | awk '{print $2}' | sort -u); do systemctl status $i; done | grep '●' | awk '{print $2}' | sort -u

Обратите внимание, что есть некоторые проблемы:

  • systemctl daemon-reload должен выполняться до перезапуска чего-либо еще
  • , если PID 1 ( сам systemd ) должен быть перезапущен, он может выполняется с помощью systemctl daemon-reexec
  • systemctl restart dbus.service нарушает работу некоторых других служб, их необходимо перезапустить после перезапуска dbus:
    • systemd сама: systemctl daemon-reexec
    • systemd-logind
    • systemd-machined
    • , возможно, другая systemd - * / другие службы, которые (сильно) используют dbus
  • Если вы подключены через SSH, и SSH необходимо перезапустить, но systemctl restart sshd не перезапускает его, пока вы подключены, я вижу 2 варианта:
    • расписание systemctl restart sshd с использованием в / cron / systemd таймеры
    • перезапуск SSH с использованием другой удаленной (защищенной) оболочки, такой как mosh
  • с запущенным screen / tmux , также могут блокировать такие службы, как SSH от перезапуска, самый простой способ - закрыть эти сеансы перед перезапуском служб
  • , как сказано в предыдущем ответе, может потребоваться выход / вход в систему, особенно для графических сеансов

1
18.06.2018, 13:38
1 ответ

Это ошибка, которую выдает ksh88 (, /bin/kshSolaris 10 и старше, и /usr/xpg4/bin/sh).

Хотя синтаксис [[... ]]происходит от ksh, =~внутри является одним из очень немногих настоящих башизмов. bashна самом деле была оболочкой, которая представила его (в версии 3.0 ).

Позже он был добавлен в ksh93(, поэтому будет работать с /bin/shи /bin/kshв Solaris 11 и новее )и zsh, с вариациями (оператор =~также доступен в test/ [builin zshиyash). ksh88 не обновлялся с 90-х годов (, за исключением исправления ошибок или исправления соответствия POSIX в некоторых системах ).

Здесь вам не нужно регулярное выражение, шаблон подстановочных знаков тоже сработает:

[[ $APP_OPTION = [1-$APP_COUNT] ]]

С оператором =(из ksh )правый операнд является шаблоном подстановочных знаков. Или вы можете использовать стандартный способ сопоставления с образцом:

case $APP_OPTION in
  [1-$APP_COUNT])...
esac

Обратите внимание, что это не будет работать для любого значения больше 9. [1-12], то же, что [21-1]соответствует только 2 и 1 (и, возможно, другим символам, которые сопоставляются так же, как 1в некоторых локалях. )).

Шаблоны подстановочных знаков ksh функционально эквивалентны расширенным регулярным выражениям (, за исключением {x,y}интервальных операторов в современных вариантах ERE ), хотя и с другим синтаксисом:

  • .->?
  • .*->*
  • x*->*(x)
  • x|y->@(x|y)
  • x?->?(x)
  • x+->+(x)
  • [^x]->[!x]
  • x{3,5}->xxx?(x)?(x)(у ksh93 есть {3,5}(x), а не у ksh88 ).

Если вам по-прежнему необходимо использовать регулярные выражения, вам потребуется использовать отдельную утилиту:

expr "x$string" : "x$regexp" # BRE, anchored at the start

STRING=$string RE=$regexp command -p awk '
  BEGIN{exit(!(ENVIRON["STRING"] ~ ENVIRON["RE"]))}'
6
27.01.2020, 23:14

Теги

Похожие вопросы