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?


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


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

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.