it-swarm.com.de

Warum beschwert sich sh (nicht bash) über Funktionen, die in meiner .bashrc definiert sind?

Ich erhalte diese, wenn ich eine Terminalsitzung öffne:

sh: Fehler beim Importieren der Funktionsdefinition für "read.json"

sh: Fehler beim Importieren der Funktionsdefinition für "ts-project"

sh mag diese Funktionen nicht, weil sie so aussehen:

read.json(){
   ::
}

und

ts-project(){
   ::
}

die eigentliche Frage ist: Warum berührt/interpretiert sh diese Dateien? Ich bin auf MacOS und habe das schon einmal gesehen, es ist so ein Rätsel. Ich würde denken, nur Bash würde diese Dateien laden.

pdate: Bash und Sh sind nichts Außergewöhnliches. Wenn ich bash in das Terminal eingebe, erhalte ich Folgendes:

alex$ bash
beginning to load .bashrc
finished loading .bashrc
bash-3.2$ 

wenn ich sh in das Terminal eingebe, erhalte ich Folgendes:

alex$ sh
sh: error importing function definition for `read.json'
sh: error importing function definition for `ts-project'
sh-3.2$ 
11
Alexander Mills

Dieser Fehler tritt auf, wenn bash, das sich als POSIX-Shell tarnt, versucht, diese Funktionen aus der Umgebung zu importieren, und nicht, wenn sie durch Interpretation einer Datei wie ~/.bashrc Oder dergleichen geladen werden. Vereinfachtes Beispiel:

foo.bar(){ true; }; export -f foo.bar; bash --posix -c true
bash: error importing function definition for `foo.bar'

Ich hatte erwartet, dass bash im Posix-Modus keine Funktionen aus der Umgebung lädt, sondern das tut es und beschwert sich nur, wenn ihre Namen lustige Zeichen enthalten.

Beachten Sie, dass bash auch im Posix-Modus ausgeführt wird, wenn die Umgebungsvariable POSIXLY_CORRECT Oder POSIX_PEDANTIC Festgelegt ist oder wenn sie mit --enable-strict-posix-default/STRICT_POSIX.

Letzteres scheint für /bin/sh Unter MacOS der Fall zu sein (siehe hier für PRODUCT_NAME = sh), Wo ich erwarte, dass dieser Fehler auch bei Verwendung von Bibliotheksfunktionen wie popen(3) oder system(3).

20
mosvy

Um den Teil darüber zu beantworten, warum read.json und ts-project sind keine tragbaren Funktionsnamen:

Laut POSIX muss ein Funktionsdefinitionbenannt von sein

ein Wort, das ausschließlich aus Unterstrichen, Ziffern und Alphabeten aus dem tragbaren Zeichensatz besteht. Das erste Zeichen eines Namens ist keine Ziffer.

Wird im C-Jargon auch als Kennung bezeichnet. Oder in Regex: [_a-zA-Z][0-9_a-zA-Z]*

5
user2394284

Was es verursacht hat, war, dass ich einige Bash-Skripte in meiner ~/.bashrc-Datei wie folgt beschaffe:

for f in "$HOME/.oresoftware/bash/"*; do
   . "$f"
done;

also habe ich es einfach geändert in:

for f in "$HOME/.oresoftware/bash/"*; do
  if [[ "$(basename "$0")" != 'sh' ]]; then
      # source only if not using sh
      . "$f"
  fi
done;

wenn es also theoretisch von sh aufgerufen wird, wird es nicht versuchen, diese Dateien zu beschaffen, aber nicht sicher, ob dies 100% der Zeit funktioniert.

0
Alexander Mills