`env <komut>` ne yapıyor?


37

Komut ne env ls -alyapıyor?

Bir Linux testim vardı ve şu soruyu sordum: "Komut doğrudan nasıl çalıştırılır ama takma adı değil?"
Bazı özel sembollerle önekleme komutu gibi bir çözüm olduğunu biliyordum, ama unuttum. Şimdi olduğunu biliyorum \. ( bu yazıdan okundu ).

Ama aynı zamanda, okuduğum bir yerden, takma adlardan kurtulmak için bir komut ekleyebileceğimizi de hatırlıyorum env. Yaptım ve işe yarıyor gibi görünüyor, ama cevabım yanlış olarak değerlendirildi. Okudum infove manüzerinde env, ama çok fazla anlaşılamamıştır vermedi.

Ne envyapıyor ve tam olarak içinde env <command>herhangi bir tartışma olmadan var envmı?


Bir not olarak, ben vardır düsünebilirz Bunu yapmanın 3 yolu olarak env <command>, command <command>ve \<command>. Bana göre bazı testler env <command>geçersizse, o zaman bu test bozulur.
Patrick

@Patrick: Bozulmadı çünkü Chris'in dediği gibi, üzerinde bir takma ad olabilir commandveya envbu da kabul edilebilir tek cevap olabilir.
Pierre Arlaud

1
@ArlaudPierre ve `\` posix'de (takma adın çıkışı olarak) tanımlanmadığından, taşınabilir değildir. Yani diğerlerinden daha kabul edilebilir değil.
Patrick

@Patrick: doğru, doğru. Şimdi bunu söylemek için testin tam çevresini bilmek zorundayız. Ancak, her durumda, "env" cevabının kabul edilebilir bir cevap olmadığını, dürüst olmadığını, bunun için seninle aynı fikirdeyim.
Pierre Arlaud

Beyler, test de insan tarafından doğrulandı (LPI onaylı eski sysadmin, şimdi diğerlerine Linux öğretiyordu) :) Doğrulayıcıya şikayet ettim, gittim manve envtam olarak ne yaptığını anlamadım . Bu gönderiden sonra açık ve cevabım gözden geçirildi (kabul edildi). Herkese teşekkürler!
ALZ

Yanıtlar:


38

Bu komut

env name=value name2=value2 program and args

komutu çalıştırır program and argsile gösterilen ortam değişkenleri ve değerleri ile mevcut ortamı uzanan ile oluşturulan bir çevre ile name=valueve name2=value2. Gibi herhangi bir argüman içermezseniz name=value, geçerli ortam değiştirilmemiş boyunca iletilir.

Takma adlarla ilgili olan en önemli şey, env'nin harici bir komut olmasıdır, bu nedenle takma adlar hakkında hiçbir "bilgisi yoktur": takma adlar, normal işlem modelinin bir parçası olmayan ve doğrudan çalışan programları etkilemeyen bir kabuk yapısıdır. kabuk dışı programlar tarafından çalıştırılır ( env gibi ). env basitçe geçer program and argumentsbir karşı exec (gibi çağrı execvp için PATH arayacaktır, program).

Temel olarak, env'nin bu şekilde kullanılması, takma adlardan, kabuk işlevlerinden, kabuk yerleşik komutlarından ve komut pozisyonu argümanlarının (örn. Program adlarının) yerini alabilecek veya geçersiz kılabilecek diğer kabuk işlevselliği bitlerinden (çoğunlukla) kabuk bağımsız bir yöntemdir. Tabii ki, envbir diğer ad veya kabuk işlevidir! envTakma ad olma konusunda endişeleniyorsanız , tam yolu heceleyebilirsiniz (örneğin /usr/bin/env, değişebilir olsa da).


24

Bir diğer önemli kullanım env(çevreleyen komut diğer adı aranmasının dışında) komutu aranmasıdır PATH. Bu, mutlak yolların gerekli olduğu yerlerde önemlidir, ancak sistemden sisteme değişir.

Örneğin, bir Bash betiği ile başlamak #!/bin/bashtamamdır, oysa her makul sisteme dahil #!bashedilmesine rağmen değildir ./binPATH

Sık sık genellikle ile başlayan Python programlarında, bu karşılaşılan #!/usr/bin/env pythondolu, sistem bağımlı yolu belirterek önlemek için pythonhala gerektirir ki, (çalıştırılabilir notta envOturuyor /usr/binbu kadar ancak piton yerini daha yaygındır, ikili).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.