web-dev-qa-db-ja.com

`env <command>`は何をしていますか?

コマンドとはenv ls -alやってる?

私はLinuxのテストを受けましたが、「コマンドを直接実行する方法はありますが、エイリアスは実行しない」という質問がありました。
コマンドの前に特別な記号を付けるような解決策があることは知っていましたが、忘れていました。今では\。 ( この投稿 から読み取ります)。

しかし、エイリアスを取り除くために、どこかでコマンドの前にenvを付けることができることを覚えています。私はそれをしました、そしてそれはうまくいくようです、しかし私の答えは間違っているとみなされました。 infomanenvを読みましたが、あまり理解していませんでした。

envは何をしていて、正確にenv <command>env自体の引数なし?

39
ALZ

このコマンド

env name=value name2=value2 program and args

program and argsおよびname=valueで指定された環境変数と値で現在の環境を拡張することによって形成された環境で、コマンドname2=value2を実行します。 name=valueなどの引数を含めない場合、現在の環境は変更されずに渡されます。

エイリアスに関して発生する重要な点は、envが外部コマンドであるため、エイリアスの「知識」がないことです。エイリアスは、通常のプロセスモデルの一部ではなく、シェル以外のプログラムによって直接実行されるプログラム(envなど)には影響しません。 envは単にprogram and argumentsexec呼び出しに渡します(-execvpのように、programのPATHを検索します) )。

基本的に、このようなenvの使用は、(ほとんど)シェルに依存しない方法であり、エイリアス、シェル関数、シェル組み込みコマンド、およびコマンド位置引数を置換または上書きする可能性があるシェル機能の他のビット(つまり、プログラム名)-もちろん、envがエイリアスまたはシェル関数でない限り! envがエイリアスであることを心配している場合は、フルパスを指定できます(例:/usr/bin/env、ただし異なる場合があります)。

40
Chris Johnsen

envのもう1つの重要な使用法(コマンドエイリアスルックアップの回避は別として)は、PATHでコマンドを検索することです。これは絶対パスが必要な場合に重要ですが、システムによって異なります。

たとえば、#!/bin/bashPATHに含まれているにもかかわらず、#!bashはそうではありませんが、/binでBashスクリプトを開始しても問題ありません。

これは、Pythonプログラムで頻繁に発生します。通常、プログラムはpython実行可能ファイルの完全なシステム依存パスを指定しないようにするために#!/usr/bin/env pythonで始まります(ただし、 env/usr/binに存在する必要がありますが、これはpythonバイナリ)の場所よりもはるかに一般的です。

26
misberner