Przejdź do głównej zawartości

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).

Okno terminala
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).

ParametrOpis
-0, --nullZakończ każdą pozycję znakiem NUL zamiast nowej linii (bezpieczne dla wartości zawierających znaki końca linii).
--helpKrótka pomoc.
--versionWersja programu.

Uwaga: Zakres opcji zależy od implementacji (GNU vs BSD/BusyBox). Warianty BSD mogą nie mieć -0.


Okno terminala
# 1) Wyświetl całe środowisko, posortuj alfabetycznie
printenv | sort
# Efekt: lista NAZWA=wartość w kolejności alfabetycznej.
Okno terminala
# 2) Pokaż wartość konkretnej zmiennej PATH
printenv PATH
# Efekt: ścieżki wyszukiwania oddzielone dwukropkami.
Okno terminala
# 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.
Okno terminala
# 4) Filtruj zmienne regionalne
printenv | grep '^LC_\|^LANG='
# Efekt: pokazuje tylko LC_* i LANG.
Okno terminala
# 5) Bezpieczne przekazywanie do xargs, gdy wartości mogą zawierać nowe linie
printenv -0 | xargs -0 -n1 echo
# Efekt: wypisuje każdą parę NAZWA=wartość w osobnym wierszu bez ryzyka błędnego podziału.
Okno terminala
# 6) Pokaż wartości kilku nazw naraz
printenv LANG LC_ALL SHELL
# Efekt: trzy linie — same wartości tych zmiennych, w kolejności podania.
Okno terminala
# 7) Porównaj środowisko czyste vs bieżące
env -i PATH="$PATH" HOME="$HOME" printenv | sort > /tmp/clean-env
printenv | sort > /tmp/current-env
diff -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 bez export 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życie env/perl -0.
  • Bezpieczeństwo: Uważaj, by nie logować sekretów (np. tokenów w ENV) do wspólnych logów/CI.

Błąd / KomunikatPrzyczynaRozwiązanie
printenv: command not foundBrak pakietu (nietypowe w nowoczesnych systemach)Zainstaluj coreutils (Linux) lub użyj alternatywy env, set, export -p.
Brak wyjścia przy printenv NAZWAZmienna nie istnieje lub istnieje, ale ma pustą wartośćSprawdź kod wyjścia (echo $?), ewentualnie `printenvgrep ‘^NAZWA=’` aby rozróżnić pustą wartość.
unrecognized option '-0'Implementacja bez opcji -0Użyj systemu z GNU coreutils, lub obejścia: `envtr ‘\n’ ‘\0’` (nie identyczne semantycznie, ale bywa wystarczające).
Znaki binarne psują potokWartość zawiera nową linięUżyj -0 i narzędzi obsługujących NUL (xargs -0, while IFS= read -r -d '' line; do ...; done).