apa yang sedang dilakukan `env <command>`?

37

Apa yang env ls -aldilakukan perintah ?

Saya memiliki tes Linux dan ada pertanyaan: "Bagaimana menjalankan perintah secara langsung, tetapi tidak alias?"
Saya tahu ada solusi seperti perintah awalan dengan simbol khusus, tapi saya lupa. Sekarang saya tahu itu \. (baca dari posting ini ).

Tetapi saya juga ingat bahwa di suatu tempat saya membaca bahwa untuk menghilangkan alias kita dapat awalan perintah dengan env. Saya melakukannya dan tampaknya berhasil, tetapi jawaban saya memenuhi syarat sebagai salah. Saya membaca infodan manpada env, tapi tidak mengerti terlalu banyak.

Apa yang envdilakukan dan tepatnya env <command>tanpa argumen untuk envdirinya sendiri?

ALZ
sumber
Sebagai catatan, 3 cara untuk melakukan hal ini yang saya dapat pikirkan adalah env <command>, command <command>, dan \<command>. Menurut pendapat saya, jika beberapa tes mengatakan env <command>tidak valid, maka tes itu rusak.
Patrick
@ Patrick: Tidak rusak karena seperti kata Chris, mungkin ada alias commandatau envyang akan membuat `\` satu-satunya jawaban yang dapat diterima.
Pierre Arlaud
1
@ArlaudPierre dan `\` tidak didefinisikan dalam posix (sebagai alias escape), jadi itu tidak portabel. Jadi tidak lebih bisa diterima dari yang lain.
Patrick
@ Patrick: benar, benar. Sekarang kita harus tahu batas pasti tes untuk mengatakan itu. Tetapi bagaimanapun juga, temukan bahwa jawaban "env" bukan jawaban yang dapat diterima tidak terlalu jujur, saya harus setuju dengan Anda mengenai hal itu.
Pierre Arlaud
Guys, tes juga diverifikasi oleh manusia (ex-sysadmin bersertifikat LPI, yang sekarang mengajar Linux) :) Saya mengeluh ke verifikasi, pergi ke mandan tidak mengerti apa yang envsebenarnya dilakukan. Setelah posting ini - jelas dan jawaban saya ditinjau (diterima). Terimakasih untuk semua!
ALZ

Jawaban:

38

Perintah ini

env name=value name2=value2 program and args

menjalankan perintah program and argsdengan lingkungan yang dibentuk dengan memperluas lingkungan saat ini dengan variabel dan nilai lingkungan yang ditentukan oleh name=valuedan name2=value2. Jika Anda tidak menyertakan argumen seperti name=value, maka lingkungan saat ini dilewatkan tanpa dimodifikasi.

Hal utama yang terjadi sehubungan dengan alias adalah bahwa env adalah perintah eksternal, sehingga tidak memiliki "pengetahuan" alias: alias adalah konstruksi shell yang bukan bagian dari model proses normal dan tidak berdampak pada program yang secara langsung dijalankan oleh program non-shell (seperti env ). env hanya meneruskan program and argumentske panggilan exec (seperti execvp , yang akan mencari PATH untuk program).

Pada dasarnya, menggunakan env seperti ini adalah (kebanyakan) cara shell-independen untuk menghindari alias, fungsi shell, perintah built-in shell, dan bit lain dari fungsionalitas shell yang mungkin mengganti atau mengganti argumen posisi perintah (yaitu nama program) —kecuali, tentu saja, envalias, atau fungsi shell! Jika Anda khawatir envmenjadi alias, Anda bisa menguraikan jalur lengkap (mis. /usr/bin/env, Meskipun mungkin berbeda).

Chris Johnsen
sumber
24

Penggunaan penting lain dari env(selain dari menghindari perintah alias mencari) adalah mencari PATHperintah. Ini sangat penting di mana jalur absolut diperlukan, tetapi berbeda dari satu sistem ke sistem lainnya.

Misalnya, memulai skrip Bash dengan #!/bin/bashbaik-baik saja, padahal #!bashtidak, meskipun /binsudah termasuk dalam PATHpada setiap sistem yang masuk akal.

Saya sering menjumpai ini dalam program Python, yang biasanya dimulai dengan #!/usr/bin/env pythonuntuk menghindari menentukan jalur penuh, bergantung pada sistem dari pythonfile yang dapat dieksekusi (namun, perlu diingat bahwa ini tetap envberada di dalam /usr/bin, ini jauh lebih umum daripada lokasi python biner).

orang kikir
sumber