Почему sh (не bash) жалуется на функции, определенные в моем .bashrc?

Точно такая же проблема. Проблема была связана с синхронизацией :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
11
29.08.2019, 02:58
3 ответа

Эта ошибка возникает, когда 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).

20
27.01.2020, 19:57

Чтобы ответить на часть о том, почему 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]*

5
27.01.2020, 19:57

Так что причиной этого было то, что я нашел несколько скриптов 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% случаев.

0
27.01.2020, 19:57

Теги

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