Co env ls -al
robi 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 info
i man
na env
, ale nie zrozumiał zbyt wiele.
Co env
robi i dokładnie env <command>
bez żadnych argumentów env
?
env <command>
,command <command>
i\<command>
. Moim zdaniem, jeśli jakiś test powiedział, żeenv <command>
jest nieważny, to ten test jest zepsuty.command
lub,env
który uczyniłby jedyną akceptowalną odpowiedź.man
i nie rozumiałem, coenv
właściwie robi. Po tym poście - jest jasne i moja odpowiedź została sprawdzona (zaakceptowana). Dziękuje za wszystko!Odpowiedzi:
To polecenie
uruchamia polecenie
program and args
ze środowiskiem utworzonym przez rozszerzenie bieżącego środowiska o zmienne środowiskowe i wartości wyznaczone przezname=value
iname2=value2
. Jeśli nie podasz żadnych takich argumentówname=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 arguments
do exec rozmowy (jak execvp , który będzie poszukać w PATHprogram
).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
env
jest aliasem lub funkcją powłoki! Jeśli martwiszenv
się, że jesteś pseudonimem, możesz przeliterować pełną ścieżkę (np/usr/bin/env
. Może się ona różnić).źródło
Innym ważnym zastosowaniem
env
(oprócz omijania wyszukiwania aliasu poleceń) jest wyszukiwaniePATH
polecenia. 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/bash
jest w porządku, ale#!bash
nie jest, mimo że/bin
jest zawarte wPATH
każdym rozsądnym systemie.Często spotkałem się z tym w programach Pythona, które zwykle zaczynają się
#!/usr/bin/env python
od unikania określenia pełnej, zależnej od systemu ścieżkipython
pliku wykonywalnego (należy jednak pamiętać, że nadal wymaga to, abyenv
rezydował/usr/bin
, jest to jednak znacznie częstsze niż lokalizacja Pythona dwójkowy).źródło