2016-08-03 3 views
2

Я прочитал Linux Command env руководство, в частности, для варианта -i, руководство говорит:почему окр -i не соответствуют руководству команды

-i, --ignore-среда # начать с пустая среда

что я получаю то, что при указании -i опции, окружающая среда является пустой, то есть, никакой переменной среды не существует, поэтому команда env -i ls должна напечатать что-то вроде команды не нашло, но я вижу, что команда выполняется успешно. Поэтому, пожалуйста, объясните, я ничего не понимаю?

ответ

0

Окружающая среда относится ко всем переменным оболочки, указанным в ваших .bashrc и .bash_profile при входе в систему. Если вы что-то компилируете, вы можете установить переменную CFLAGS. Если у вас есть что-то, установленное в странном каталоге, вы можете сделать export PATH=$PATH:$HOME/build/bin, чтобы он мог работать без указания его полного пути.

env -i очищает все эти переменные, заданные пользователем, и дает вам пустую среду, поэтому вы можете, например, проверить, как работает команда, если у вас нет ни одной из этих дополнительных переменных.

+0

В соответствии с вашим ответом 'env -i' должен очистить все эти пользовательские переменные, включая' PATH' varibale, чтобы оболочка не могла найти, где находится 'ls', но результат не соответствует моему thoughs. – Tracy

+0

Включая * пользовательские дополнения * к переменной PATH. Базовая переменная ОС PATH (и я думаю, что все, что вы настроили в/etc/skel), сохраняется через очистку среды, поэтому такие вещи, как/bin,/usr/bin и/usr/local/bin, будут сохраняться. – ijustlovemath

+1

Я думаю, что лучше прочитать исходный код, чтобы узнать, сохраняется ли переменная ОС PATH с помощью очистки среды – Tracy

1

Я думаю, что лучше читать исходный код, чтобы выяснить, сохраняется ли переменная PATH OS через очистку окружающей среды - Трейси

Чтение исходного кода, конечно, дать всю информацию о дело. Но мы можем также получить ценные подсказки с помощью strace:

 
>strace -eexecve env -i ls  
execve("/usr/bin/env", ["env", "-i", "ls"], [/* 48 vars */]) = 0 
execve("ls", ["ls"], [/* 0 vars */]) = -1 ENOENT (No such file or directory) 
execve("/bin/ls", ["ls"], [/* 0 vars */]) = 0 

Мы видим, что env пытается исполняющие "ls" без пути первой, которая выйдет из строя, а затем пытается выполнения "/bin/ls", который успешно. Мы также видим это начать с пустой среды[/* 0 vars */].

 
>strace -eexecve env -i foo 
execve("/usr/bin/env", ["env", "-i", "foo"], [/* 48 vars */]) = 0 
execve("foo", ["foo"], [/* 0 vars */]) = -1 ENOENT (No such file or directory) 
execve("/bin/foo", ["foo"], [/* 0 vars */]) = -1 ENOENT (No such file or directory) 
execve("/usr/bin/foo", ["foo"], [/* 0 vars */]) = -1 ENOENT (No such file or directory) 
env: foo: No such file or directory 

При указании несуществующей команды или команд проживающих в каком-то другом пути, мы видим, что env наконец пробует /usr/bin/ пути, и это все. Итак, очевидно, /bin/ и /usr/bin/ жестко закодированы в env, а с -i среда команды действительно пуста. Другой тест:

 
>env -i strace ls 
strace: ls: command not found 

ls Если должен быть выполнен не непосредственно env -i, но косвенно через другую команду, он не найден.

Смежные вопросы