"सुडो: स्रोत: कमांड नहीं मिला"


15
$ source /etc/environment 

$ sudo source /etc/environment 
[sudo] password for t: 
sudo: source: command not found

ऐसा लगता है कि bashनिष्पादित करने के लिए की तुलना में एक अलग शेल चलाया जाता है source /etc/environmentऔर उस शेल sourceमें बिलिन नहीं है ।

लेकिन मेरे और रूट के डिफ़ॉल्ट गोले दोनों हैं bash

$ echo $SHELL
/bin/bash

यदि sudoवास्तव में एक अलग शेल का उपयोग करता है, तो यह क्यों है? मैंने स्लम के उत्तर को देखा , लेकिन मेरे मामले में समझ में नहीं आया।


4
sourceएक शेल बिलिन है..आप sudoएक बाहरी कमांड की तरह शेल बिलिन को चलाने के लिए उपयोग नहीं कर सकते हैं ..
हेमेयेल

क्या समस्या यह है कि आप फ़ाइल नहीं पढ़ सकते हैं, या आप बाद के sudo कमांड पर लागू करने के लिए फ़ाइल में परिभाषित वातावरण चाहते हैं?
रैंडम 832

@ Random832: बाद में सूडो कमांड पर लागू करने के लिए फ़ाइल में परिभाषित पर्यावरण चाहते हैं
टिम

जवाबों:


23

sourceशेल निर्मित है, इसलिए इसे शेल के बिना निष्पादित नहीं किया जा सकता है। हालाँकि, डिफ़ॉल्ट रूप से, sudoशेल चलाएँ नहीं। सेsudo

प्रक्रिया प्रतिमान

जब सूडो एक कमांड चलाता है, तो यह फोर्क (2) को कॉल करता है, निष्पादन वातावरण को ऊपर वर्णित के रूप में सेट करता है, और बच्चे की प्रक्रिया में निष्पादित सिस्टम कॉल को कॉल करता है।

यदि आप शेल को स्पष्ट रूप से निष्पादित करना चाहते हैं, तो -sविकल्प का उपयोग करें :

# sudo -s source /etc/environment

जो अभी भी बेकार है क्योंकि शेल के बाहर निकलने के बाद, पर्यावरण परिवर्तन खो जाता है।


7

प्रश्न का उत्तर देने के बजाय समस्या को हल करने के दायरे में , यहां एक फ़ाइल को स्रोत करने का सबसे स्पष्ट (मेरे लिए) तरीका है जो केवल रूट पढ़ सकता है:

source <(sudo cat /etc/environment)

यह प्रक्रिया प्रतिस्थापन का उपयोग करता है । यह catकमांड का आउटपुट लेता है और इसे एक छद्म फाइल में बदल देता है, जिसे आप पास कर सकते हैं source। source इसके बाद करंट शेल में कमांड चलाता है।

ध्यान दें कि अधिकांश प्रणालियों पर, /etc/environmentविश्व-पठनीय है, इसलिए आपको इसे चलाने में सक्षम होना चाहिए :

source /etc/environment

1
यह काम करता है, स्वीकार किए जाते हैं
क्लॉडिउ क्रेगना

2

sudoएक कमांड की अपेक्षा करता है, लेकिन आप एक शेल बिलिन दे रहे हैं ताकि यह कमांड को ढूंढ न सके। यदि आप लिखते हैं type source, तो आप आउटपुट देख सकते हैं: source is a shell builtinऔर का आउटपुट which sourceखाली है।

उदाहरण के लिए sudo straceकाम करेगा और which straceआउटपुट देगा क्योंकि स्ट्रेस एक कमांड है।

संपादित करें: इसके अलावा, आप sudo su;sudo source /etc/environmentकामों को अच्छी तरह से देख सकते हैं इसलिए विभिन्न शेल का उपयोग नहीं किया जाता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.