W Bash możesz przekierować wszystkie przyszłe standardowe wyjścia aktualnie uruchomionego skryptu. Na przykład za pomocą tego skryptu
exec > >(logger -t my-awesome-script)
echo 1
echo 2
echo 3
To skończy się w syslog:
Oct 26 01:03:16 mybox my-awesome-script[72754]: 1
Oct 26 01:03:16 mybox my-awesome-script[72754]: 2
Oct 26 01:03:16 mybox my-awesome-script[72754]: 3
Ale jest to specyficzne dla Bash i nagi exec z przekierowaniem nie działa w Dash.
Syntax error: redirection unexpected
Jak mogę sprawić, by działał w Dash, a może w obu powłokach?
>
w myślniku. Zdaję sobie sprawę, że wydajesz się prosić o coś innego, ale nie jestem w stanie powiedzieć, co to jest.Odpowiedzi:
Możesz po prostu zrobić:
Możesz to zrobić za pomocą dowolnej powłoki.
Jeśli nie podoba ci się jego wygląd, być może skrypt powinien się zawinąć w funkcję.
źródło
run ${1+"$@"} || do stuff
taka, aby argumenty zostały zachowane.${1+"$@"}
nic"$@"
nie robi. W każdym razie miał inne problemy."$@"
przejdzie,""
gdy nie będzie żadnych argumentów, a${1+"$@"}
przekaże pusty ciąg, gdy nie będzie żadnych argumentów. Ma to ogromne znaczenie dla wielu programów, ponieważ parsują one""
jako pusty argument, podczas gdy (niecytowany) pusty ciąg nie byłby w ogóle interpretowany jako argument.dash
w takim systemie) , ale poza tym"$@"
jest wyjątkowa, ponieważ przypadek zero-argumentów nie zastępuje argumentu zerowego dla powłok POSIX."${@+is especially cool $@}"
. W końcu jednak nie różni się praktycznie niczym od starego${1+”$@"}
obejścia. Jeśli masz ksh93:"${1+quoted" not quoted "quoted again}"
Podstawianie procesów można łatwo symulować za pomocą nazwanych potoków.
W rzeczywistości nazwane potoki są jednym z mechanizmów (drugi to
/dev/fd
), za pomocą których można zaimplementować podstawianie procesówbash
.źródło
Nie sądzę, żeby było to możliwe
dash
. O ile wiem z tejman
strony , nie obsługuje on podstawiania procesów.Aby obejść ten problem , możesz wypróbować sugestię mikserv lub przekierować wszystko do pliku, a następnie po zakończeniu skryptu (prawdopodobnie jest to skrypt), dodaj zawartość tego pliku do programu rejestrującego:
źródło
dash
innych powłokach. Podstawienie procesu jest po prostu argumentem wskazującym na/dev/fd/[num]
link do anonimowego potoku.dash
robi tutaj dokumenty z anonimowymi potokami, a nie generuje pliki tymczasowe, jak większość innych powłok. Takcat /dev/fd/3 3<<HEREDOC\n$(get output)\nHEREDOC\n
jest nie tylko funkcjonalny odpowiednik, można nawet dostać się do nazwy FD siebie. Jednak twoja uwaga jest słuszna, jeśli idzie się w drugą stronę - musisz otworzyć nowy FDexec
i proces, który go odczytuje.cat /dev/fd/3 3<<HEREDOC\n$(get output)\nHEREDOC\n
„łatwiej” niżcat <(get output)
?< >
przekierowania powłoki. Zasadniczo, jeśli wykonasz tylko dwa z nich, możesz także układać na kolejnych liniach. Ale tak, masz rację - lubię tutaj dokumenty. Mimo to, tyle rzeczy, które mogą wymagać zapamiętania, myślę, że łatwiej jest, gdy działają one uniwersalnie. Z drugiej strony wiele osób nie ma większego zastosowania dla innych pocisków, więc nie ma to dla nich znaczenia. Po prostu nie jestem wśród nich./dev/fd/3
(w tej precyzyjnej formie) i szczegóły tego, co dzieje się z białymi znakami. . . i jeśli o to chodzi, fakt, że całe to podejście działa w ogóle w Dash, gdy nie działa w innych powłokach, które mają wszystkie komponenty, oznacza, że ogólne podejście jest specjalną zasadą do zapamiętania. (To przypomina mi o próbach stworzenia uproszczonego angielskiego z mniejszym słownictwem; wycinają słowa takie jak wytrwałość , ale ignorują równie trudne idiomy jak kontynuowanie .)