`env <lệnh>` đang làm gì?


37

Lệnh env ls -alđang làm gì?

Tôi đã có một bài kiểm tra Linux và có câu hỏi: "Làm thế nào để chạy lệnh trực tiếp, nhưng không phải là bí danh của nó?"
Tôi biết rằng có tồn tại giải pháp như lệnh tiền tố với một số ký hiệu đặc biệt, nhưng tôi đã quên nó. Bây giờ tôi biết rằng nó là \. (đọc từ bài này ).

Nhưng tôi cũng nhớ rằng ở đâu đó tôi đọc được rằng để loại bỏ bí danh, chúng ta có thể đặt tiền tố cho một lệnh env. Tôi đã làm nó và nó có vẻ hoạt động, nhưng câu trả lời của tôi là đủ điều kiện là sai. Tôi đọc infovà tiếp mantục env, nhưng không hiểu quá nhiều.

Những gì đang envlàm và chính xác trong env <command>mà không có bất kỳ đối số cho envchính nó?


Là một lưu ý, 3 cách để làm điều này mà tôi có thể nghĩ đến là env <command>, command <command>, và \<command>. Theo tôi, nếu một số thử nghiệm nói env <command>là không hợp lệ, thì thử nghiệm đó bị hỏng.
Patrick

@Patrick: Nó không bị hỏng vì như Chris đã nói, có thể có một bí danh commandhoặc envsẽ làm cho `\` câu trả lời duy nhất được chấp nhận.
Pierre Arlaud

1
@ArlaudPierre và `\` không được định nghĩa trong posix (như một lối thoát bí danh), vì vậy nó không khả dụng. Vì vậy, nó không được chấp nhận hơn những người khác.
Patrick

@Patrick: đúng, đúng. Bây giờ chúng ta phải biết chu vi chính xác của bài kiểm tra để nói điều đó. Nhưng trong mọi trường hợp, thấy rằng câu trả lời "env" không phải là câu trả lời chấp nhận được là không trung thực, tôi phải đồng ý với bạn về điều đó.
Pierre Arlaud

Các bạn ơi, bài kiểm tra cũng được xác minh bởi con người (ex-sysadmin được chứng nhận LPI, hiện đang dạy Linux khác) :) Tôi phàn nàn với người xác minh, đã đi đến manvà không hiểu envchính xác những gì đang làm. Sau bài đăng này - nó rõ ràng và câu trả lời của tôi đã được xem xét (chấp nhận). Cảm ơn tất cả!
ALZ

Câu trả lời:


38

Lệnh này

env name=value name2=value2 program and args

chạy lệnh program and argsvới một môi trường được hình thành bằng cách mở rộng môi trường hiện tại với các biến và giá trị môi trường được chỉ định bởi name=valuename2=value2. Nếu bạn không bao gồm bất kỳ đối số nào như thế name=value, thì môi trường hiện tại được chuyển qua không thay đổi.

Điều quan trọng xảy ra đối với các bí danh là env là một lệnh bên ngoài, vì vậy nó không có kiến ​​thức về chế độ bí danh. chạy bởi các chương trình không phải vỏ (như env ). env chỉ đơn giản là vượt qua program and argumentsmột exec cuộc gọi (như execvp , mà sẽ tìm kiếm PATH cho program).

Về cơ bản, sử dụng env như thế này là một cách độc lập (hầu hết) để tránh các bí danh, các hàm shell, các lệnh dựng sẵn shell và bất kỳ bit nào khác của chức năng shell có thể thay thế hoặc ghi đè các đối số vị trí lệnh (ví dụ như tên chương trình) Tất nhiên, envlà một bí danh, hoặc hàm shell! Nếu bạn lo lắng về việc envtrở thành bí danh, bạn có thể đánh vần đường dẫn đầy đủ (ví dụ: /usr/bin/envmặc dù nó có thể thay đổi).


24

Một cách sử dụng quan trọng khác env(ngoài việc tìm kiếm bí danh tìm kiếm bí danh) là nó tìm kiếm PATHlệnh. Điều này rất quan trọng khi các đường dẫn tuyệt đối được yêu cầu, nhưng khác nhau tùy theo hệ thống.

Ví dụ, bắt đầu một tập lệnh Bash #!/bin/bashlà ổn, trong khi #!bashkhông, mặc dù /binđược bao gồm trong PATHmọi hệ thống hợp lý.

Tôi thường gặp điều này trong các chương trình Python, thường bắt đầu bằng #!/usr/bin/env pythoncách tránh chỉ định đường dẫn đầy đủ, phụ thuộc hệ thống của pythontệp thực thi (tuy nhiên, lưu ý rằng nó vẫn yêu cầu envcư trú /usr/bin, tuy nhiên điều này phổ biến hơn nhiều so với vị trí của con trăn nhị phân).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.