Как определить имя функции bash как регулярное выражение

Пример CentOS 7, сборка Relion.

# yum install openmpi-devel fftw-devel fltk-devel
# cp /usr/lib64/openmpi/bin/* /usr/bin/

git clone https://github.com/3dem/relion.git
cd relion/
mkdir -p external/fltk/lib      // 'make install' fails if no (empty) lib/ folder
mkdir build
cd build/
cmake..
make
.
[100%] Built target tiltpair_plot

# make install

Результат:Relion-git.040918-1.el7.x86_64.rpm(2,0 МБ)https://drive.google.com/file/d/1c3loJFCladmqvemHyKu44FxZzdOr-XJN/view?usp=sharing→ Предоставляет /usr/local/bin/{45 файлов}, /usr/local/lib/{ gui _background.xpm, librelion _gui _lib.so, librelion _lib.so }

Загрузите и установите:cd Downloads/ && yum install./Relion-git.040918-1.el7.x86_64.rpm

$ relion:Графический интерфейс Relion открывается нормально.


$ ldd relion | grep Xlib
        libXrender.so.1 => /lib64/libXrender.so.1 (0x00007f2cf841c000)
        libXcursor.so.1 => /lib64/libXcursor.so.1 (0x00007f2cf8211000)
        libXfixes.so.3 => /lib64/libXfixes.so.3 (0x00007f2cf800b000)
        libXext.so.6 => /lib64/libXext.so.6 (0x00007f2cf7df8000)
        libXft.so.2 => /lib64/libXft.so.2 (0x00007f2cf7be2000)
        libXinerama.so.1 => /lib64/libXinerama.so.1 (0x00007f2cf77a1000)
        libX11.so.6 => /lib64/libX11.so.6 (0x00007f2cf7463000)
        libXau.so.6 => /lib64/libXau.so.6 (0x00007f2cf60b7000)

# yum provides */libXcursor.so.1,
И т. д. и т. д., чтобы определить имена вашей «отсутствующей libX **-devel».

0
17.02.2020, 00:49
2 ответа

Следующий подход будет работать для zsh:

preexec() {
  if [[ $1 = <-> ]]; then
    $1() {
      echo $0
      unfunction $0
    }                                                            
  fi
}

Как отмечалось в комментариях к вашему вопросу, у вас не может быть функции с именем переменной. Что это делает, так это использует хук preexecдля перехвата команд до того, как у него появится шанс на сбой и создание временной функции. Я использую вариант этого с почтовой программой nmh для отображения почтовых сообщений e -по номеру.

3
28.04.2021, 23:23

В bash вы можете использовать функцию command_not_found_handle.

Позаботьтесь о том, чтобы и)некоторые дистрибутивы уже использовали его, чтобы предоставить функцию «установить foobar , если вы хотите использовать команду foo », и b)он не будет отменять внешние команды, как это делают функции оболочки.

Также обратите внимание, что \dне поддерживается диалектом регулярных выражений, используемым bash с оператором =~(, который, кстати, является единственным использованием регулярных выражений в bash ).

2digits(){
    echo "$1_or_smth"
}
command_not_found_handle(){
    if [[ $1 =~ ^[0-9]{2}$ ]]; then 2digits "$@"
    else printf >&2 '%s: command not found\n' "$1"; return 127 
    fi
}

, затем

$ 33
33_or_smth
$ 444
444: command not found

То же самое работает в zsh с command_not_found_handlerфункцией (обратите внимание на разницу в именах --в zsh есть лишний "r" ).

Хотя вы можете имитировать zsh preexecс ловушкой DEBUGв bash, вы не сможете проделать трюк из другого ответа, поскольку bash не допускает имена функций, которые содержат только цифры.

1
28.04.2021, 23:23

Теги

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