що робить `env <command>`?


37

Що env ls -alробить команда ?

У мене був тест Linux, і виникло питання: "Як запустити команду безпосередньо, але не її псевдонім?"
Я знав, що існує таке рішення, як команда префіксації якогось спеціального символу, але забув його. Тепер я знаю, що це так \. (читайте з цієї публікації ).

Але я також пам’ятаю, що десь я читав, що для позбавлення від псевдоніма ми можемо встановити префікс команди env. Я це зробив і, здається, працює, але моя відповідь була кваліфікована як неправильна. Я прочитав infoі manна env, але не зрозумів , занадто багато.

Що envробиш і саме так, env <command>без жодних аргументів для envсебе?


Як примітка, 3 способи зробити це , що я можу думати є env <command>, command <command>і \<command>. На мою думку, якщо якийсь тест, про який говорять env <command>, недійсний, то цей тест порушений.
Патрік

@Patrick: Це не порушено, тому що, як сказав Кріс, може бути псевдонім на commandабо envякий зробить `` `єдино прийнятною відповіддю.
П'єр Арло

1
@ArlaudPierre і `\` не визначено в posix (як псевдонім утечі), тому він не є портативним. Тож це не більш прийнятно, ніж інші.
Патрік

@Patrick: вірно, правда. Тепер ми повинні знати точний периметр тесту, щоб сказати це. Але в будь-якому випадку, знайдіть, що відповідь "env" не є прийнятною, не дуже чесно, я б з цим згодився з вами.
П’єр Арло

Хлопці, тест був перевірений і людиною (сертифікований LPI екс-sysadmin, який зараз навчає інших Linux) :) Я поскаржився на верифікатора, пішов manі не зрозумів, що envсаме робить. Після цієї публікації - зрозуміло, і моя відповідь була переглянута (прийнята). Дякую всім!
АЛЗ

Відповіді:


38

Ця команда

env name=value name2=value2 program and args

запускає команду program and argsіз середовищем, сформованим шляхом розширення поточного середовища із змінними середовища та значеннями, визначеними name=valueі name2=value2. Якщо ви не включите будь-які такі аргументи name=value, то поточне середовище передається без змін.

Ключове, що відбувається у відношенні псевдонімів, - це те, що env - це зовнішня команда, тому вона не має «знань» про псевдоніми: псевдоніми - це конструкція оболонки, яка не є частиною звичайної моделі процесу та не впливає на програми, які безпосередньо працює за допомогою програм без оболонок (наприклад, env ). окр просто проходить program and argumentsдо ехес виклику (наприклад , execvp , який буде шукати шлях до program).

В основному, використання env, подібного до цього, є (переважно) незалежним від оболонок способом уникнення псевдонімів, функцій оболонки, вбудованих команд оболонок та будь-яких інших бітів функціональності оболонки, які можуть замінити або переосмислити аргументи командної позиції (тобто назви програм) - безрезультатно, Звичайно, envце псевдонім або функція оболонки! Якщо ви переживаєте envза псевдонім, ви можете прописати повний шлях (наприклад /usr/bin/env, він може відрізнятися).


24

Ще одне важливе використання env(крім обходу пошукового псевдоніма команди) - це пошук PATHкоманди. Це важливо там, де потрібні абсолютні шляхи, але вони відрізняються від системи до системи.

Наприклад, починати Bash-скрипт з #!/bin/bashнормально, тоді #!bashяк ні, незважаючи на /binте, що він включений до PATHкожної розумної системи.

Я часто стикався з цим у програмах Python, які зазвичай починаються з того, #!/usr/bin/env pythonщоб уникнути вказівки повного, залежного від системи шляху pythonвиконуваного файлу (зауважте, однак, що він все ще вимагає того, що envзнаходиться у ньому /usr/bin, але це набагато частіше, ніж місце розташування пітона двійкові).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.