Estou recebendo este quando abro uma sessão de terminal:
sh: erro ao importar a definição da função para `read.json '
sh: erro ao importar a definição da função para `ts-project '
sh não gosta dessas funções porque elas se parecem com:
read.json(){
::
}
e
ts-project(){
::
}
a verdadeira questão é: por que sh
tocar / interpretar esses arquivos? Estou no MacOS e já vi isso antes, é um mistério. Eu acho que apenas o bash estaria carregando esses arquivos.
update : bash e sh não são nada fora do comum. quando digito bash no terminal, recebo o seguinte:
alex$ bash
beginning to load .bashrc
finished loading .bashrc
bash-3.2$
quando digito sh
o terminal, recebo o seguinte:
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
fonte
fonte
sh
seja o que origina o arquivo .profile?bash
fonte, uma comSTRICT_POSIX
a outra sem ela.Respostas:
Esse erro ocorre quando o
bash
disfarce como um shell POSIX tenta importar essas funções do ambiente, não ao carregá-las, interpretando um arquivo como~/.bashrc
esse. Exemplo simplificado:Eu esperava
bash
não carregar funções do ambiente quando estava no modo posix, mas sim , e só reclama quando seus nomes contêm caracteres engraçados.Observe que
bash
também será executado no modo posix quando a variável de ambientePOSIXLY_CORRECT
ouPOSIX_PEDANTIC
estiver definida ou quando foi compilada com--enable-strict-posix-default
/STRICT_POSIX
.Este último parece ser o caso para
/bin/sh
no MacOS (olhar aqui paraPRODUCT_NAME = sh
), onde eu espero que este erro também gatilho quando usando funções de biblioteca comopopen(3)
ousystem(3)
.fonte
sh
é o que tornou a vulnerabilidade do shellshock / bashdoor muito pior.SHELLOPTS=posix
e-o posix
para outras formas de ativar o modo posix.set -a
/set -o allexport
também faz com que bash para exportar todas as funções (e se invocado comosh
, provocaPOSIXLY_CORRECT
a ser definido e exportados!)sh -a
causasPOSIXLY_CORRECT
a serem definidas e exportadas;set -a
depois que osh
sem-a
foi iniciado não exportaPOSIXLY_CORRECT
porque foi definido antes-a
estava em vigor).Para responder à parte sobre o porquê
read.json
ets-project
não são nomes de funções portáteis:De acordo com o POSIX, uma definição de função deve ser nomeada por
Também conhecido como identificador , na linguagem C. Ou no regex:
[_a-zA-Z][0-9_a-zA-Z]*
fonte
zsh
/rc
/fish
...)bash
, ou que seria funções não importação do ambiente, enquanto no modo POSIX, o que não é exigido pelo POSIX especificação ;-)Então, o que causou foi que eu estou fornecendo alguns scripts bash no meu arquivo ~ / .bashrc da seguinte forma:
então eu mudei para:
portanto, em teoria, se for chamado até
sh
então, ele não tentará obter esses arquivos, mas não tem certeza se isso funciona 100% do tempo.fonte