Точно такая же проблема. Проблема была связана с синхронизацией :wlan0 не был готов, когда процесс загрузки выдал ifup
.
Я решил эту проблему, добавив оператор ожидания pre-up sleep 5
в wlan0 в файле интерфейсов:
marcelo@breeze:~$ cat /etc/network/interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
source /etc/network/interfaces.d/*
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
auto wlan0
allow-hotplug wlan0
iface wlan0 inet static
pre-up sleep 5
address 10.0.0.42
netmask 255.255.255.0
gateway 10.0.0.2
dns-nameservers 10.0.0.2
wpa-ssid mycoolssid
wpa-psk returnguantanamo
Эта ошибка возникает, когда bash
, маскируясь под оболочку POSIX, пытается импортировать эти функции из среды, а не при их загрузке путем интерпретации файла, подобного ~/.bashrc
или подобного. Упрощенный пример:
foo.bar(){ true; }; export -f foo.bar; bash --posix -c true
bash: error importing function definition for `foo.bar'
Я ожидал, что bash
не будут загружаться функции из среды в режиме posix, но это происходит и ругается только тогда, когда их имена содержат забавные символы.
Обратите внимание, что bash
также будет работать в режиме posix, если установлена переменная окружения POSIXLY_CORRECT
или POSIX_PEDANTIC
или если он был скомпилирован с --enable-strict-posix-default
/ STRICT_POSIX
.
Это последнее относится к /bin/sh
в MacOS (см. здесь для PRODUCT_NAME = sh
), где я ожидаю, что эта ошибка также будет возникать при использовании библиотечных функций, таких как popen(3)
или system(3)
.
Чтобы ответить на часть о том, почему read.json
и ts-project
не являются переносимыми именами функций:
Согласно POSIX, определение функции должно быть названо по
a word consisting solely of underscores, digits, and alphabetics from the portable character set. The first character of a name is not a digit.
Также известен как идентификатор на жаргоне C. Или в регулярном выражении:[_a-zA-Z][0-9_a-zA-Z]*
Так что причиной этого было то, что я нашел несколько скриптов bash в моем файле ~/.bashrc:
for f in "$HOME/.oresoftware/bash/"*; do
. "$f"
done;
поэтому я просто изменил его на:
for f in "$HOME/.oresoftware/bash/"*; do
if [[ "$(basename "$0")" != 'sh' ]]; then
# source only if not using sh
. "$f"
fi
done;
поэтому теоретически, если он вызывается sh
, он не будет пытаться получить эти файлы, но не уверен, что это работает в 100% случаев.