Итак, вот как я решил эту проблему после долгой возни:
Последнее обновление 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
... поэтому я переустановил его, и проблема была решена.
кажется, вам нужна точка (. )нравится
#!/bin/sh
. includeMe.sh
но если вы хотите просто запустить все скрипты из команды, например, без императивного "включить"...
exit
, она выручит ваш текущий сеанс оболочки просто попробуйте создать скрипт
script.sh:
#!/bin/bash
echo 'bye world';
exit
и запустите его как ./script.sh
и сравните с../script.sh
Должен ли это быть исходный сценарий? Сделайте это функцией. Поэтому вместо
$ . 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
, если необходимо. (Что уже было предложено А.Б. в их ответе .)
Есть несколько стратегий, которые вы можете использовать для вывода сообщения об ошибке, если вы запускаете сценарий, который должен быть источником.
Вы можете проверить, соответствует ли $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