`env <command>` กำลังทำอะไรอยู่


37

คำสั่งenv ls -alกำลังทำอะไร

ฉันมีการทดสอบลินุกซ์และมีคำถาม: "วิธีเรียกใช้คำสั่งโดยตรง แต่ไม่ใช่นามแฝง?"
ฉันรู้ว่ามีวิธีแก้ปัญหาเช่นคำสั่ง prefixing พร้อมสัญลักษณ์พิเศษบางอย่าง แต่ฉันลืมไป \ตอนนี้ผมรู้ว่ามันเป็น (อ่านจากโพสต์นี้ )

แต่ฉันยังจำได้ว่ามีบางแห่งที่ฉันอ่านเพื่อกำจัดนามแฝงเราสามารถใช้คำสั่งenvล่วงหน้าได้ ฉันทำมันและดูเหมือนว่าใช้งานได้ แต่คำตอบของฉันมีคุณสมบัติผิด ผมอ่านinfoและmanบนenvแต่ไม่ได้เข้าใจมากเกินไป

กำลังenvทำอะไรอยู่และenv <command>โดยไม่มีข้อโต้แย้งสำหรับenvตัวเอง?


เป็นบันทึก 3 วิธีการทำเช่นนี้ที่ฉันสามารถคิดเป็นenv <command>, และcommand <command> \<command>ในความเห็นของฉันถ้าการทดสอบบางอย่างกล่าวว่าenv <command>ไม่ถูกต้องการทดสอบนั้นก็จะไม่ดี
Patrick

@ แพทริก: มันไม่ได้หักเพราะอย่างที่คริสพูดอาจมีนามแฝงอยู่commandหรือenvจะให้คำตอบที่ยอมรับได้เท่านั้น
Pierre Arlaud

1
@ArlaudPierre และ `\` ไม่ได้กำหนดไว้ใน posix (เป็น alias escape) ดังนั้นจึงไม่สามารถพกพาได้ ดังนั้นจึงไม่เป็นที่ยอมรับมากกว่าคนอื่น
Patrick

@ แพทริก: จริงจริง ตอนนี้เราต้องรู้ขอบเขตของการทดสอบเพื่อบอกว่า แต่ไม่ว่าในกรณีใดก็ตามพบว่าคำตอบ "env" นั้นไม่ใช่คำตอบที่ยอมรับได้ไม่ซื่อสัตย์มากฉันต้องเห็นด้วยกับคุณในเรื่องนั้น
Pierre Arlaud

Guys การทดสอบนั้นได้รับการตรวจสอบจากมนุษย์ด้วย (เช่น LP-sysadmin ที่ผ่านการรับรองซึ่งสอน Linux อื่น ๆ ในตอนนี้) :) ฉันบ่นกับผู้ตรวจสอบไปmanและไม่เข้าใจenvว่ากำลังทำอะไรอยู่ หลังจากโพสต์นี้ - ชัดเจนและคำตอบของฉันได้รับการตรวจสอบ (ยอมรับ) ขอบคุณทุกคน!
ALZ

คำตอบ:


38

คำสั่งนี้

env name=value name2=value2 program and args

รันคำสั่งprogram and argsกับสภาพแวดล้อมที่เกิดขึ้นโดยการขยายสภาพแวดล้อมในปัจจุบันที่มีตัวแปรสภาพแวดล้อมและค่าที่กำหนดโดยและname=value name2=value2หากคุณไม่ได้รวมอาร์กิวเมนต์ใด ๆ เช่นname=valueสภาพแวดล้อมปัจจุบันจะถูกส่งผ่านโดยไม่มีการแก้ไข

สิ่งสำคัญที่เกิดขึ้นเกี่ยวกับนามแฝงคือenvเป็นคำสั่งภายนอกดังนั้นจึงไม่มี "ความรู้" ของนามแฝง: นามแฝงเป็นโครงสร้างเปลือกที่ไม่ได้เป็นส่วนหนึ่งของแบบจำลองกระบวนการปกติและไม่มีผลกระทบต่อโปรแกรมที่โดยตรง ดำเนินการโดยโปรแกรมที่ไม่ใช่เชลล์ (เช่นenv ) envเพียงส่งผ่านprogram and argumentsไปยังการเรียกexec (เช่นexecvpซึ่งจะค้นหา PATH สำหรับprogram)

โดยทั่วไปการใช้envเช่นนี้เป็นวิธีที่ไม่ขึ้นกับเชลล์ในการหลีกเลี่ยงนามแฝงฟังก์ชันเชลล์คำสั่ง shell builtin และบิตการทำงานเชลล์อื่น ๆ ที่อาจแทนที่หรือแทนที่อาร์กิวเมนต์ตำแหน่งคำสั่ง (เช่นชื่อโปรแกรม) แน่นอนว่าenvเป็นนามแฝงหรือฟังก์ชั่นเปลือก! หากคุณกังวลเกี่ยวกับenvการเป็นนามแฝงคุณสามารถสะกดเส้นทางเต็ม (เช่น/usr/bin/envแม้ว่ามันอาจแตกต่างกันไป)


24

การใช้ที่สำคัญอีกอย่างหนึ่งของenv(นอกเหนือจากการหลีกเลี่ยงการค้นหานามแฝงคำสั่ง) คือการค้นหาPATHคำสั่ง นี่เป็นสิ่งสำคัญที่จำเป็นต้องใช้พา ธ สัมบูรณ์ แต่แตกต่างกันไปในแต่ละระบบ

ตัวอย่างเช่นการเริ่มต้นสคริปต์ Bash ด้วย#!/bin/bashไม่เป็นไร#!bashแม้ว่าจะไม่ได้/binรวมอยู่ในPATHระบบที่เหมาะสมทุกระบบ

ฉันมักจะพบสิ่งนี้ในโปรแกรม Python ซึ่งมักจะเริ่มต้นด้วย #!/usr/bin/env pythonการหลีกเลี่ยงการระบุเส้นทางที่ขึ้นอยู่กับระบบของการpythonปฏิบัติการ (หมายเหตุอย่างไรก็ตามมันยังต้องการที่envอยู่ใน/usr/binนั้นนี่เป็นเรื่องธรรมดามากกว่าที่ตั้งของงูหลาม เลขฐานสอง).

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.