Стратегия, позволяющая забыть запустить сценарий с `исходным кодом`?

Итак, вот как я решил эту проблему после долгой возни:

Последнее обновление dnf содержало обновление ядра, в мой случай, который заставил меня перейти с версии 4.1 на версию 4.2 ... итак:

1. Сначала я удалил, теперь уже устаревший kmod-VirtualBox, который я использовал:

$ dnf list installed | grep kmod-VirtualBox*
akmod-VirtualBox.x86_64                    4.3.30-1.fc22                @rpmfusion-free-updates
kmod-VirtualBox-4.1.10-200.fc22.x86_64.x86_64
kmod-VirtualBox-4.1.7-200.fc22.x86_64.x86_64

$ sudo dnf remove kmod-VirtualBox-4.1.10-200.fc22.x86_64.x86_64
$ sudo dnf remove kmod-VirtualBox-4.1.7-200.fc22.x86_64.x86_64
$ sudo dnf remove akmod-VirtualBox.x86_64

Этот последний (akmod) мог не понадобиться но я все равно это сделал.

2. Я удалил VirtualBox и перезагрузился.

$ dnf list installed | grep virtualbox
VirtualBox-5.0.x86_64                      5.0.6_103037_fedora22-1      @virtualbox
$ sudo dnf remove VirtualBox-5.0.x86_64
$ shutdown -r now

3. Как только система вернулась после перезагрузки, я переустановил виртуальный бокс, и он установил правильный kmod:

$ sudo dnf install VirtualBox-5.0-5.0.6_103037_fedora22-1.x86_64

Теперь он снова работает.

Надеюсь, это поможет кому-то с той же проблемой, так как я потратил целый день, пытаясь понять это :)


Примечание: перед повторной установкой попробуйте вручную загрузить vboxdrv, используя следующее:

$ sudo /etc/init.d/vboxdrv setup

В моем случае по какой-то причине драйвера больше не было ...

$ sudo /etc/init.d/vboxdrv setup
sudo: /etc/init.d/vboxdrv: command not found

... поэтому я переустановил его, и проблема была решена.

1
06.05.2018, 16:36
3 ответа

кажется, вам нужна точка (. )нравится

#!/bin/sh
. includeMe.sh

но если вы хотите просто запустить все скрипты из команды, например, без императивного "включить"...

  1. нельзя, так как при вводе команды она выполняется системным ()вызовом (такой синтаксис)
  2. это было бы плохо, потому что если в скрипте, который вы запускаете таким образом, есть команда exit, она выручит ваш текущий сеанс оболочки

просто попробуйте создать скрипт

script.sh:

#!/bin/bash
echo 'bye world';
exit

и запустите его как ./script.shи сравните с../script.sh

1
27.01.2020, 23:11

Должен ли это быть исходный сценарий? Сделайте это функцией. Поэтому вместо

$ . something some args            # run it

есть

$ cat define_something.sh
something() {
    commands here...
}
$ . define_something.sh            # load the function definition
$ something some args              # run the function

Или, если вы хотите, чтобы фактические команды были в исходном скрипте, создайте функцию для его исходного кода:

something() {
   . something "$@"
}

, а затем просто запустите something foo barвместо . something foo bar.

Конечно, функции скрывают позиционные параметры основного окружения оболочки, поэтому там это не сработает. Возможно, псевдоним от somethingдо . something, если необходимо. (Что уже было предложено А.Б. в их ответе .)

1
27.01.2020, 23:11

Есть несколько стратегий, которые вы можете использовать для вывода сообщения об ошибке, если вы запускаете сценарий, который должен быть источником.

  • Вы можете проверить, соответствует ли $0названию вашего скрипта; если это так, это не источник, поэтому напечатайте сообщение об ошибке и выход:

    if [ "${0##*/}" = "myscript" ]; then
        echo "Don't run me, source me" >&2
        exit 1
    fi
    

    (Затем вам нужно будет позаботиться об обновлении всякий раз, когда ваш скрипт переименовывается...)

    Вариантом этого может быть проверка $0на соответствие содержимому /etc/shells, если это допустимое ограничение (, т.е. сценарии ваших оболочек запускаются только с использованием перечисленных там оболочек, что ни в коем случае обязательство ).

  • Если ваш скрипт предназначен только для использования в интерактивной оболочке, вы можете проверить это — если он запускается, а не загружается, он не будет в интерактивной оболочке:

    case "$-" in
    *i*) ;;
    *) echo "Don't run me, source me" >&2; exit 1 ;;
    esac
    
2
27.01.2020, 23:11

Теги

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