/ bin / sh źródło ze stdin (z innego programu) nie plik


11

Trudno nazwać to ...

Zasadniczo mam program, który po uruchomieniu wypisuje na STDOUT zestaw zmiennych powłoki:

$ ./settings
SETTING_ONE="this is setting one"
SETTING_TWO="This is the second setting"
ANOTHER_SETTING="This is another setting".

Chcę uruchomić to w skrypcie powłoki tak, jakby STDOUT był oceniany source.

Chciałbym zrobić coś takiego ...

source `./settings`

... ale oczywiście to nie działa.

Wiem, że mógłbym:

./settings >/tmp/file
source /tmp/file

ale naprawdę nie chcę tego robić.

Jakieś wskazówki?

Odpowiedzi:


11

Możesz użyć eval:

eval "$(./settings)"

eval "`./settings`"

Przepraszam, powinienem wspomnieć, że / bin / sh nie bash. $ () nie działa. Zaktualizowałem pytanie.
Majenko

@ Mat: Cóż, sh jest bash na większości systemów. O ile oczywiście nie miałeś na myśli ostatnich wersji Ubuntu, gdzie został zastąpiony myślnikiem.
Hello71

@Matt: W takim przypadku backticks powinien działać. Ale powinieneś dodać dokładną wersję sh też - może to być dowiązanie symboliczne do myślnika, popiołu, busybox ... Nie widziałem kopii „prawdziwego„ sh ”na żywo.
grawity

1
@ Mat: Masz tam ... interesujący system. Zwłaszcza, że ​​prawie wszystkie warianty „sh” obsługują $( ) - zaczynając od powłoki Almquista 4.3BSD - i to także POSIX. (Uwaga: nie kłócąc się, tylko ciekawy.)
grawity

$ () istnieje, po prostu nie działa w ten sposób. FreeBSD 8.2 / bin / sh
Majenko

13

W systemach gdzie /dev/fd jest dostępny, bash obsługuje podstawianie procesów:

source <(./settings)

Tutaj, <( ) rozwinie się do automatycznie przypisanej ścieżki pod /dev/fd/... z którego wyjście ./settings można przeczytać.


1
W podręczniku basha nazywa się to „zastępowaniem procesu”.
glenn jackman

5
declare `./settings`

Albo oczywiście ...

export `./settings`

Przetestuj to oczywiście ...

export `echo -e "asdf=test\nqwerty=dvorak"` ; echo $asdf $qwerty

Obsługa białych znaków:

eval export `./settings`

Aha, ta export sztuczka działa! Dzięki
Majenko

Teraz - jak mogę obsługiwać spacje w wartości?
Majenko

@Matt: Nie mogę używać komentarzy w komentarzach, więc proszę zobaczyć edytowaną odpowiedź.
grawity

@ grawity: Tak, możesz ... a backtick --> ` <-- and here's another one --> ` <--
Hello71

0

source /dev/stdin < ./settings

Myślę, że / dev / stdin to jednak tylko Linux.


który próbuje pobrać treść ustawień. Nawet z „./settings” kończy się niepowodzeniem z „./settings”: niejednoznaczny („= backtick)
Majenko

/dev/stdin działa również na BSD i Cygwin.
grawity

1
Za pomocą |jednak jest nie będzie działać (przynajmniej nie dokładnie), ponieważ obie strony potoku są oddzielnymi podprocesami, więc źródła poleceń nie będą miały wpływu na bieżącą powłokę.
grawity

edytowane, aby to odzwierciedlić.
LawrenceC
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.