cosa sta facendo `env <command>`?


37

Cosa sta env ls -alfacendo il comando ?

Ho fatto un test Linux e c'era una domanda: "Come eseguire il comando direttamente, ma non il suo alias?"
Sapevo che esiste una soluzione come il comando di prefisso con qualche simbolo speciale, ma l'ho dimenticato. Ora so che lo è \. (leggi da questo post ).

Ma ricordo anche che da qualche parte ho letto che per sbarazzarci dell'alias possiamo prefiggere un comando con env. L'ho fatto e sembra funzionare, ma la mia risposta è stata qualificata come sbagliata. Ho letto infoe mansu env, ma non ho capito troppo.

Cosa sta envfacendo ed esattamente env <command>senza alcun argomento per envse stesso?


Come nota, 3 modi di fare questo che mi viene in mente sono env <command>, command <command>e \<command>. Secondo me, se alcuni test hanno dichiarato che env <command>non è valido, allora quel test è rotto.
Patrick,

@Patrick: non è rotto perché, come ha detto Chris, potrebbe esserci un alias commando envche renderebbe `\` l'unica risposta accettabile.
Pierre Arlaud,

1
@ArlaudPierre e `\` non sono definiti in posix (come alias escape), quindi non è portatile. Quindi non è più accettabile degli altri.
Patrick,

@Patrick: vero, vero. Ora dovremmo conoscere il perimetro esatto del test per dirlo. Ma in ogni caso, scopri che la risposta "env" non è accettabile non è molto onesta, dovrei essere d'accordo con te su questo.
Pierre Arlaud,

Ragazzi, il test è stato verificato anche da umani (ex-amministratore di sistema certificato LPI, che insegna ora altri Linux) :) Mi sono lamentato con il verificatore, sono andato a mane non ho capito cosa envstesse facendo esattamente. Dopo questo post - è chiaro e la mia risposta è stata rivista (accettata). Grazie a tutti!
ALZ,

Risposte:


38

Questo comando

env name=value name2=value2 program and args

esegue il comando program and argscon un ambiente formato estendendo l'ambiente corrente con le variabili e i valori di ambiente indicati da name=valuee name2=value2. Se non si includono argomenti del genere name=value, l'ambiente corrente viene trasmesso senza modifiche.

La cosa chiave che accade rispetto agli alias è che env è un comando esterno, quindi non ha "conoscenza" degli alias: gli alias sono un costrutto shell che non fa parte del normale modello di processo e non ha alcun impatto sui programmi che sono direttamente gestito da programmi non shell (come env ). env passa semplicemente program and argumentsa una chiamata exec (come execvp , che cercherà il PERCORSO program).

Fondamentalmente, usare env in questo modo è un modo (principalmente) indipendente dalla shell per evitare alias, funzioni della shell, comandi incorporati della shell e qualsiasi altro bit di funzionalità della shell che potrebbe sostituire o sovrascrivere gli argomenti della posizione di comando (cioè i nomi dei programmi) —unless, ovviamente, envè un alias o funzione shell! Se sei preoccupato di envessere un alias, potresti precisare l'intero percorso (ad esempio /usr/bin/env, sebbene possa variare).


24

Un altro uso importante di env(oltre a eludere la ricerca di alias di comando) è che cerca PATHil comando. Ciò è importante quando sono richiesti percorsi assoluti, ma variano da sistema a sistema.

Ad esempio, iniziare uno script Bash con #!/bin/bashva bene, mentre #!bashnon lo è, nonostante /binsia incluso in PATHogni sistema ragionevole.

Ho riscontrato spesso questo nei programmi Python, che di solito iniziano con #!/usr/bin/env pythonper evitare di specificare il percorso completo e dipendente dal sistema pythondell'eseguibile (nota, tuttavia, che richiede ancora che envrisieda /usr/bin, questo è comunque molto più comune della posizione del python binario).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.