co robi `env <polecenie>`?

37

Co env ls -alrobi polecenie ?

Miałem test na Linuksie i pojawiło się pytanie: „Jak uruchomić polecenie bezpośrednio, ale nie jego alias?”
Wiedziałem, że istnieje rozwiązanie takie jak polecenie poprzedzające prefiksem jakimś specjalnym symbolem, ale zapomniałem o tym. Teraz wiem, że tak jest \. (czytaj z tego postu ).

Ale pamiętam też, że gdzieś to przeczytałem, aby pozbyć się aliasu, możemy poprzedzić polecenie env. Zrobiłem to i wydaje się, że działa, ale moja odpowiedź została uznana za błędną. Czytam infoi manna env, ale nie zrozumiał zbyt wiele.

Co envrobi i dokładnie env <command>bez żadnych argumentów env?

ALZ
źródło
Jako notatkę, 3 sposoby na zrobienie tego, że mogę myśleć o to env <command>, command <command>i \<command>. Moim zdaniem, jeśli jakiś test powiedział, że env <command>jest nieważny, to ten test jest zepsuty.
Patrick
@Patrick: Nie jest zepsuty, ponieważ, jak powiedział Chris, może istnieć alias na commandlub, envktóry uczyniłby jedyną akceptowalną odpowiedź.
Pierre Arlaud,
1
@ArlaudPierre i `\` nie jest zdefiniowany w posix (jako ucieczka aliasu), więc nie jest przenośny. Więc nie jest bardziej do zaakceptowania niż inne.
Patrick
@Patrick: true, true. Aby to powiedzieć, musielibyśmy znać dokładny obwód testu. Ale w każdym razie stwierdzenie, że odpowiedź „env” nie jest akceptowalna, nie jest zbyt uczciwa, musiałbym się z tobą zgodzić.
Pierre Arlaud,
Chłopaki, test został również zweryfikowany przez człowieka (ex-sysadmin z certyfikatem LPI, który uczy teraz innych Linuksa) :) Skarżyłem się na weryfikator, poszedłem mani nie rozumiałem, co envwłaściwie robi. Po tym poście - jest jasne i moja odpowiedź została sprawdzona (zaakceptowana). Dziękuje za wszystko!
ALZ,

Odpowiedzi:

38

To polecenie

env name=value name2=value2 program and args

uruchamia polecenie program and argsze środowiskiem utworzonym przez rozszerzenie bieżącego środowiska o zmienne środowiskowe i wartości wyznaczone przez name=valuei name2=value2. Jeśli nie podasz żadnych takich argumentów name=value, bieżące środowisko jest przekazywane niezmodyfikowane.

Kluczową rzeczą, która dzieje się w odniesieniu do aliasów jest to, że env jest poleceniem zewnętrznym, więc nie ma „wiedzy” o aliasach: aliasy są konstrukcją powłoki, która nie jest częścią normalnego modelu procesu i nie ma wpływu na programy, które są bezpośrednio uruchamiane przez programy inne niż powłoki (takie jak env ). ENV po prostu przechodzi program and argumentsdo exec rozmowy (jak execvp , który będzie poszukać w PATH program).

Zasadniczo, używanie env w ten sposób jest (głównie) niezależnym od powłoki sposobem unikania aliasów, funkcji powłoki, wbudowanych poleceń powłoki i wszelkich innych części funkcji powłoki, które mogłyby zastąpić lub zastąpić argumenty pozycji poleceń (tj. Nazwy programów) - chyba że oczywiście envjest aliasem lub funkcją powłoki! Jeśli martwisz envsię, że jesteś pseudonimem, możesz przeliterować pełną ścieżkę (np /usr/bin/env. Może się ona różnić).

Chris Johnsen
źródło
24

Innym ważnym zastosowaniem env(oprócz omijania wyszukiwania aliasu poleceń) jest wyszukiwanie PATHpolecenia. Ma to znaczenie tam, gdzie wymagane są ścieżki bezwzględne, ale różnią się w zależności od systemu.

Na przykład rozpoczęcie skryptu Bash #!/bin/bashjest w porządku, ale #!bashnie jest, mimo że /binjest zawarte w PATHkażdym rozsądnym systemie.

Często spotkałem się z tym w programach Pythona, które zwykle zaczynają się #!/usr/bin/env pythonod unikania określenia pełnej, zależnej od systemu ścieżki pythonpliku wykonywalnego (należy jednak pamiętać, że nadal wymaga to, aby envrezydował /usr/bin, jest to jednak znacznie częstsze niż lokalizacja Pythona dwójkowy).

misberner
źródło