printenv
- printenv – program do wypisywania zmiennych środowiskowych procesu. Bez argumentów drukuje całe środowisko w postaci linii
NAZWA=wartość
; z argumentami podaje wartości wskazanych nazw. - Typowe zastosowania: diagnostyka konfiguracji, debugowanie skryptów, przekazywanie zmiennych do innych narzędzi (
grep
,xargs
), sprawdzanie obecności/ustawienia zmiennej. - Dostępne w większości dystrybucji Linux (GNU coreutils), systemach BSD i macOS (drobnymi różnicami opcji). W powłoce istnieją też alternatywy:
env
,set
,export
/declare -x
(bash).
Składnia
Dział zatytułowany „Składnia”printenv [OPCJE] [NAZWA ...]
- Bez podania
NAZWA
– wypisuje całe środowisko (po jednej zmiennej na linię). - Z jedną lub wieloma nazwami – wypisuje tylko wartości tych zmiennych (po jednej na linię), bez prefiksu
NAZWA=
. - Nadaje się do użycia interaktywnego i w skryptach (np. warunki zależne od obecności zmiennych, logowanie konfiguracji).
Parametry
Dział zatytułowany „Parametry”Parametr | Opis |
---|---|
-0 , --null | Zakończ każdą pozycję znakiem NUL zamiast nowej linii (bezpieczne dla wartości zawierających znaki końca linii). |
--help | Krótka pomoc. |
--version | Wersja programu. |
Uwaga: Zakres opcji zależy od implementacji (GNU vs BSD/BusyBox). Warianty BSD mogą nie mieć
-0
.
Przykłady użycia
Dział zatytułowany „Przykłady użycia”# 1) Wyświetl całe środowisko, posortuj alfabetycznieprintenv | sort# Efekt: lista NAZWA=wartość w kolejności alfabetycznej.
# 2) Pokaż wartość konkretnej zmiennej PATHprintenv PATH# Efekt: ścieżki wyszukiwania oddzielone dwukropkami.
# 3) Sprawdź, czy zmienna jest ustawiona (różnicuj: unset vs. pusty ciąg)if printenv MY_FLAG >/dev/null; then echo "ustawiona (może być pusta)"; else echo "nieustawiona"; fi# Efekt: kod 0 gdy zmienna istnieje (nawet jeśli pusta), 1 gdy nie istnieje.
# 4) Filtruj zmienne regionalneprintenv | grep '^LC_\|^LANG='# Efekt: pokazuje tylko LC_* i LANG.
# 5) Bezpieczne przekazywanie do xargs, gdy wartości mogą zawierać nowe linieprintenv -0 | xargs -0 -n1 echo# Efekt: wypisuje każdą parę NAZWA=wartość w osobnym wierszu bez ryzyka błędnego podziału.
# 6) Pokaż wartości kilku nazw narazprintenv LANG LC_ALL SHELL# Efekt: trzy linie — same wartości tych zmiennych, w kolejności podania.
# 7) Porównaj środowisko czyste vs bieżąceenv -i PATH="$PATH" HOME="$HOME" printenv | sort > /tmp/clean-envprintenv | sort > /tmp/current-envdiff -u /tmp/clean-env /tmp/current-env | less# Efekt: różnice między minimalnym a pełnym środowiskiem sesji.
- Środowisko vs. zmienne powłoki:
printenv
pokazuje tylko zmienne wyeksportowane (export
w bash). Zmienne lokalne powłoki bezexport
nie będą widoczne. - Pusta wartość a brak zmiennej: Dla pojedynczej nazwy
printenv
zwraca kod 0, gdy zmienna istnieje (nawet jeśli ma pustą wartość), oraz kod 1, gdy nie istnieje. Obie sytuacje mogą nic nie wydrukować — rozróżnienie wyłącznie po kodzie wyjścia. - Format wyjścia: Bez nazw – linie
NAZWA=wartość
; z nazwami – tylko wartości (po jednej na linię). To ma znaczenie przy dalszym parsowaniu. - Przenośność: Skrypty, które wymagają
-0
, mogą nie działać na systemach bez tej opcji (np. część BSD/BusyBox). Rozważ defensywną ścieżkę lub użycieenv
/perl -0
. - Bezpieczeństwo: Uważaj, by nie logować sekretów (np. tokenów w
ENV
) do wspólnych logów/CI.
Najczęściej spotykane błędy i jak je naprawić
Dział zatytułowany „Najczęściej spotykane błędy i jak je naprawić”Błąd / Komunikat | Przyczyna | Rozwiązanie | |
---|---|---|---|
printenv: command not found | Brak pakietu (nietypowe w nowoczesnych systemach) | Zainstaluj coreutils (Linux) lub użyj alternatywy env , set , export -p . | |
Brak wyjścia przy printenv NAZWA | Zmienna nie istnieje lub istnieje, ale ma pustą wartość | Sprawdź kod wyjścia (echo $? ), ewentualnie `printenv | grep ‘^NAZWA=’` aby rozróżnić pustą wartość. |
unrecognized option '-0' | Implementacja bez opcji -0 | Użyj systemu z GNU coreutils, lub obejścia: `env | tr ‘\n’ ‘\0’` (nie identyczne semantycznie, ale bywa wystarczające). |
Znaki binarne psują potok | Wartość zawiera nową linię | Użyj -0 i narzędzi obsługujących NUL (xargs -0 , while IFS= read -r -d '' line; do ...; done ). |
Linki i źródła
Dział zatytułowany „Linki i źródła”- man printenv (GNU coreutils) – strona podręcznika.
- GNU Coreutils – printenv – dokumentacja online.
- FreeBSD printenv(1) – wariant BSD/macOS.
- Bash manual – Shell Variables / Environment – różnice między zmiennymi powłoki a środowiskiem.