Pracując nad niektórymi funkcjami bash, nie znałem source ...
polecenia, więc użyłem eval $(cat ...)
zamiast tego. Teraz zastanawiam się, czy powinienem zmieniać każde jego użycie, czy może to tylko ta sama funkcja?
Wygląda na to, że działają teraz tak samo, ale może później pojawią się mylące różnice, chcę tylko wiedzieć.
command-line
bash
Benzoes
źródło
źródło
eval "$(cat file)"
source
ponieważ jest to polecenie stworzone specjalnie do tego.Jak już wspomniano w @glennjackman, będziesz chciał zacytować podstawienie polecenia, w przeciwnym razie dzielenie słów i rozwijanie nazw ścieżek zmodyfikuje zawartość przed jej ewaluacją. I chociaż oba wykonają polecenia z pliku, istnieją różnice.
Gdy źródła skryptu, różne specjalne zmienne powłoki zostanie zmodyfikowany, przede wszystkim
BASH_SOURCE
,BASH_LINENO
iFUNCNAME
tablic. Są one przydatne do drukowania komunikatów o błędach i debugowania.Możesz powrócić ze skryptu źródłowego za pomocą
return
polecenia (help return
). Dzięki eval nie uzyskasz tego efektu. Podobnie pułapka POWRÓT nie zostanie uruchomiona dla eval.Pozyskując skrypt, możesz przekazać mu argumenty. Nie możesz tego zrobić z tym eval.
W przypadku eval podstawienie polecenia odczyta całą zawartość pliku do pamięci przed przekazaniem go do eval. Po jego źródle, bash będzie czytał z pliku w miarę jego działania.
źródło
Ładne podsumowanie tego, co robią źródła, eval i exec: http://www.unix.com/shell-programming-scripting/54347-bash-shell-exec-eval-source-looking-help-understand.html
Sądzę, że twoje użycie eval i source'owania pliku zrobi to samo. Nie jestem jednak do końca pewien, czy zmienne w indeksie będą zachowywać się tak samo w każdym przypadku. Zalecam użycie źródła, jeśli to możliwe, ponieważ jest to najprostsza droga i sprawia, że kod jest bardziej czytelny.
źródło
$(cat file)
->$(< file)