Recibo este cuando abro una sesión de terminal:
sh: error al importar la definición de función para `read.json '
sh: error al importar la definición de la función para 'ts-project'
A sh no le gustan estas funciones porque se ven así:
read.json(){
::
}
y
ts-project(){
::
}
La verdadera pregunta es: ¿por qué sh
tocar / interpretar estos archivos? Estoy en MacOS y he visto esto antes, es un misterio. Creo que solo bash estaría cargando estos archivos.
actualización : bash y sh no son nada fuera de lo común. cuando escribo bash en la terminal, obtengo esto:
alex$ bash
beginning to load .bashrc
finished loading .bashrc
bash-3.2$
cuando escribo sh
en la terminal, obtengo esto:
alex$ sh
sh: error importing function definition for `read.json'
sh: error importing function definition for `ts-project'
sh-3.2$
bash
shell
bash-functions
Alexander Mills
fuente
fuente
sh
¿cuál es la fuente del archivo .profile?bash
fuente, uno conSTRICT_POSIX
el otro sin él.Respuestas:
Ese error ocurre cuando se hace pasar
bash
por un shell POSIX que intenta importar esas funciones del entorno, no cuando las carga interpretando un archivo como~/.bashrc
o tal. Ejemplo simplificado:Esperaba
bash
no cargar funciones del entorno cuando estaba en modo posix, pero lo hace , y solo se queja cuando sus nombres contienen caracteres divertidos.Tenga en cuenta que
bash
también se ejecutará en modo POSIX cuando elPOSIXLY_CORRECT
oPOSIX_PEDANTIC
se establece la variable de entorno, o cuando se compila con--enable-strict-posix-default
/STRICT_POSIX
.Este último parece ser el caso para
/bin/sh
el MacOS (ver aquí paraPRODUCT_NAME = sh
), donde espero que este error también gatillo cuando el uso de funciones de biblioteca comopopen(3)
osystem(3)
.fuente
sh
es lo que hizo la shellshock / bashdoor vulnerabilidad de un montón peor.SHELLOPTS=posix
y-o posix
otras formas de habilitar el modo posix.set -a
/set -o allexport
también hace que bash exporte todas las funciones (y si se invoca comosh
, hacePOSIXLY_CORRECT
que se configuren y exporten)sh -a
hacePOSIXLY_CORRECT
que se establezca y se exporte;set -a
después de que se iniciósh
sin,-a
no se exportaPOSIXLY_CORRECT
porque se estableció antes de que-a
estuviera vigente).Para responder la parte sobre por qué
read.json
yts-project
no son nombres de funciones portátiles:Según POSIX, una definición de función debe ser nombrada por
También conocido como identificador , en C lingo. O en expresiones regulares:
[_a-zA-Z][0-9_a-zA-Z]*
fuente
zsh
/rc
/fish
...)bash
, o no importaría funciones del entorno mientras está en modo POSIX, que no es requerido por la especificación POSIX ;-)Entonces, lo que causó fue que obtuve algunos scripts de bash en mi archivo ~ / .bashrc de esta manera:
así que lo cambié a:
así que, en teoría, si se llama para
sh
entonces, no intentará obtener esos archivos, pero no estoy seguro si funciona el 100% del tiempo.fuente