Otrzymuję ten, gdy otwieram sesję terminalową:
sh: błąd podczas importowania definicji funkcji dla `read.json '
sh: błąd podczas importowania definicji funkcji dla `ts-project '
sh nie lubi tych funkcji, ponieważ wyglądają jak:
read.json(){
::
}
i
ts-project(){
::
}
prawdziwe pytanie brzmi - dlaczego sh
dotykanie / interpretowanie tych plików? Jestem na MacOS i widziałem to wcześniej, to taka tajemnica. Myślę, że tylko bash ładowałby te pliki.
aktualizacja : bash i sh nie są niczym niezwykłym. kiedy wpisuję bash w terminalu, otrzymuję to:
alex$ bash
beginning to load .bashrc
finished loading .bashrc
bash-3.2$
kiedy piszę sh
w terminalu, otrzymuję to:
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
źródło
źródło
sh
jest to, z jakich źródeł plik .profile?bash
źródła, z tego jednegoSTRICT_POSIX
bez drugiego.Odpowiedzi:
Ten błąd występuje, gdy
bash
podszywanie się pod powłokę POSIX próbuje zaimportować te funkcje ze środowiska, a nie podczas ładowania ich przez interpretację takiego~/.bashrc
lub podobnego pliku . Uproszczony przykład:Spodziewałem się, że
bash
nie będę ładować funkcji ze środowiska, gdy jest w trybie posix, ale tak jest i tylko narzekam, gdy ich nazwy zawierają śmieszne postacie.Zauważ, że
bash
będzie również działać w trybie posix kiedyPOSIXLY_CORRECT
lubPOSIX_PEDANTIC
zmienna jest ustawiona, lub gdy został skompilowany z--enable-strict-posix-default
/STRICT_POSIX
.To ostatnie wydaje się być w przypadku
/bin/sh
na MacOS (patrz tutaj dlaPRODUCT_NAME = sh
), gdzie spodziewam się ten błąd również wywołać przy użyciu funkcji bibliotecznych jakpopen(3)
isystem(3)
.źródło
sh
sprawia, że luka w shellshock / bashdoor jest znacznie gorsza.SHELLOPTS=posix
i-o posix
inne sposoby włączenia trybu posiksowego.set -a
/set -o allexport
także powoduje, że bash eksportuje wszystkie funkcje (a jeśli zostanie wywołany jakosh
, powodujePOSIXLY_CORRECT
ustawienie i eksport!)sh -a
powodujePOSIXLY_CORRECT
ustawienie i wyeksportowanie; funkcja „set -a
posh
bez”-a
nie eksportuje,POSIXLY_CORRECT
ponieważ została ustawiona wcześniej-a
).Aby odpowiedzieć na część dotyczącą nazw funkcji
read.json
its-project
nie są przenośnymi funkcjami:Zgodnie z POSIX definicja funkcji musi być nazwana przez
Znany również jako identyfikator w języku C. Lub w wyrażeniu regularnym:
[_a-zA-Z][0-9_a-zA-Z]*
źródło
zsh
/rc
/fish
...)bash
, że w trybie POSIX nie importuje funkcji ze środowiska, co nie jest wymagane przez specyfikację POSIX ;-)Co spowodowało, że pozyskałem niektóre skrypty bash w moim pliku ~ / .bashrc w następujący sposób:
więc właśnie zmieniłem to na:
więc teoretycznie, jeśli zostanie wywołany do
sh
tego czasu, nie będzie próbował źródła tych plików, ale nie jest pewien, czy to zadziała przez 100% czasu.źródło