Perché sh (non bash) si lamenta delle funzioni definite nel mio .bashrc?


11

Ricevo questo quando apro una sessione terminale:

sh: errore durante l'importazione della definizione della funzione per `read.json '

sh: errore durante l'importazione della definizione della funzione per `ts-project '

A sh non piacciono queste funzioni perché sembrano:

read.json(){
   ::
}

e

ts-project(){
   ::
}

la vera domanda è: perché shtoccare / interpretare questi file? Sono su MacOS e l'ho visto prima, è un vero mistero. Penserei che solo bash avrebbe caricato questi file.

aggiornamento : bash e sh non sono niente di straordinario. quando digito bash nel terminale, ottengo questo:

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

quando scrivo shnel terminale, ottengo questo:

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

1
Forse / bin / sh è bash su quel sistema?
Jeff Schaller

1
nessuno di loro si procura l'un l'altro, ho scoperto che era una cattiva pratica nel modo più duro. tuttavia, ~ / .profile sta acquistando un file bash condiviso, quindi forse da shcosa proviene il file .profile?
Alexander Mills,

1
Le informazioni sull'avere un file ~ / .profile che genera il file condiviso sembrano importanti per me.
Jeff Schaller

3
Quello che intendevo con / bin / sh essendo bash è che è possibile che sia collegato in modo simbolico o hardlink a bash. Bash quindi emula sh, ma anche fonti ~ / .profile. Non so come i pacchetti OSX sh e bash.
Jeff Schaller

3
Sono costruiti dalla stessa bashfonte, l'uno con STRICT_POSIX, l'altro senza.
mosvy,

Risposte:


20

Questo errore si verifica quando il bashmascheramento come shell POSIX tenta di importare tali funzioni dall'ambiente, non quando le si carica interpretando un file simile ~/.bashrco simile. Esempio semplificato:

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

Mi aspettavo di bashnon caricare le funzioni dall'ambiente quando era in modalità posix, ma lo fa , e mi lamento solo quando i loro nomi contengono personaggi divertenti.

Si noti che bashverrà eseguito anche in modalità posix quando è impostata la variabile di ambiente POSIXLY_CORRECTo POSIX_PEDANTICo quando è stata compilata con --enable-strict-posix-default/ STRICT_POSIX.

Quest'ultimo sembra essere il caso per /bin/shil MacOS (aspetto qui per PRODUCT_NAME = sh), dove mi aspetto che questo errore anche grilletto quando si utilizzano le funzioni di libreria come popen(3)o system(3).


3
La correzione: non esportare funzioni nell'ambiente. È l'anti-funzionalità bash che ha portato (o meglio, semplicemente era) Shellshock e avrebbe dovuto essere rimosso, ma non perché le persone lo stessero usando in modo folle. Non essere uno di loro.
R .. GitHub smette di aiutare ICE il

Il fatto che bash importa funzioni anche quando viene chiamato come shè ciò che ha peggiorato molto la vulnerabilità shellshock / bashdoor .
Stéphane Chazelas,

Vedi anche SHELLOPTS=posixe -o posixper altri modi per abilitare la modalità posix.
Stéphane Chazelas,

Nota anche che set -a/ set -o allexportfa sì che bash esporti tutte le funzioni (e se invocato come sh, causa POSIXLY_CORRECTl'impostazione e l'esportazione!)
Stéphane Chazelas,

( sh -afa sì POSIXLY_CORRECTche venga impostato ed esportato; set -adopo che è stato avviato shsenza senza, -anon viene esportato POSIXLY_CORRECTperché è stato impostato prima che -afosse attivo).
Stéphane Chazelas,

5

Per rispondere alla parte sul perché read.jsone ts-projectnon sono nomi di funzioni portatili:

Secondo POSIX, una definizione di funzione deve essere nominata da

una parola composta esclusivamente da caratteri di sottolineatura, cifre e alfabeti dal set di caratteri portatile. Il primo carattere di un nome non è una cifra.

Conosciuto anche come identificatore , in gergo C. O in regex:[_a-zA-Z][0-9_a-zA-Z]*


Ma POSIX non proibisce alle implementazioni di accettare altri nomi per le funzioni, quindi bash non ha dovuto imporre tali restrizioni in modalità POSIX. i nomi delle funzioni condividono lo stesso spazio dei nomi degli argomenti dei comandi, quindi non c'è motivo di accettare qualsiasi cosa (come zsh/ rc/ fish...)
Stéphane Chazelas,

@ StéphaneChazelas: lo so, ma cosa significa essere in modalità POSIX, se non "eliminare tutte le estensioni", come in "non accettarle in silenzio"?
user2394284,

@ user2394284 certamente non significa che in bash, o non importerebbe le funzioni dall'ambiente mentre è in modalità POSIX, che non è richiesto dalle specifiche POSIX ;-)
mosvy

@mosvy: Sì, è evidente che bash non è riuscito da qualche parte lungo la strada - direi che è una semplice shell POSIX, che sarebbe un bug.
user2394284,

0

Quindi ciò che lo ha causato è stato procurarmi alcuni script bash nel mio file ~ / .bashrc in questo modo:

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

quindi l'ho appena cambiato in:

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

quindi in teoria se viene chiamato shallora non proverà a procurarsi quei file, ma non è sicuro che funzioni il 100% delle volte.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.