क्यों सूद एलियंस को अनदेखा करता है?


22

मैं Ubuntu 10.04 चला रहा हूं और मैं upstartडेमॉन प्रबंधन के लिए उपयोग करता हूं । मेरा उद्यम अनुप्रयोग एक डेमन के रूप में चलाया जाता है और विभिन्न विशेषाधिकारों के कारण इसे रूट के रूप में चलाया जाना चाहिए। उदाहरण के लिए:

sudo start my-application-long-ID
sudo stop my-application-long-ID
etc

मैं aliasइन कमांड्स को संक्षिप्त रूप में पेश करना चाहता हूं जैसे कि:

alias startapp='sudo start my-application-long-ID'

और इसे चलाने के रूप में startappऔर वह काम करता है, लेकिन मैं उपनाम में sudo नहीं करना पसंद करेंगे।

alias startapp='start my-application-long-ID'

का उपयोग करते हुए sudo startapp, लौटते समय नहीं sudo: startapp: command not found

हालाँकि, जब मैंने उपनाम जोड़ा:

alias sudo='sudo '

sudo startapp अब काम करता है लेकिन मैं अभी भी उत्सुक हूं कि सूडो एलिय्याह की उपेक्षा क्यों करते हैं।


क्या आपकी दौड़ थी source ~/.bashrc? यह .bashrc फ़ाइल को अपडेट करता है और नए उपनाम उपलब्ध कराता है?
मनु

@manu हाँ, मैंने किया
उभयलिंगी

जवाबों:


35

मैं नीचे दी गई जानकारी यहाँ से देखता हूँ ।

सुडो का उपयोग करते समय, उर्फ ​​विस्तार का उपयोग करें (अन्यथा sudo आपके उपनामों को अनदेखा करता है)

alias sudo='sudo '

यहां काम नहीं करने का कारण यहां बताया गया है

बैश केवल एक उपनाम के लिए एक कमांड का पहला शब्द चेक करता है, उसके बाद कोई भी शब्द चेक नहीं किया जाता है। इसका मतलब है कि sudo ll जैसे कमांड में, केवल पहले शब्द (sudo) को एक उपनाम के लिए bash द्वारा चेक किया जाता है, ll को अनदेखा किया जाता है। हम उपनाम को उपनाम के बाद अगले शब्द की जांच करने के लिए बता सकते हैं (अर्थात सूडो), उपनाम के मूल्य के अंत में एक स्थान जोड़कर।


6

उपनाम और कार्यों को एक शेल में परिभाषित किया गया है। सुडो एक बाहरी कार्यक्रम है। इसलिए सूडो को केवल बाहरी आदेशों के आधार पर उपनाम, कार्य या शेल बिल्ड नहीं दिखाई देते हैं।

उपनामों को वैकल्पिक कमांड नामों के लिए माना जाता है, इसलिए गोले केवल कमांड स्थिति में उनका विस्तार करते हैं, न कि जब वे आदेशों का तर्क देते हैं। Zsh वैश्विक उपनामों का समर्थन करता है, जो कमांड लाइन पर कहीं भी विस्तारित होते हैं, और बखूबी उपयोग करते हैं क्योंकि आकस्मिक रूप से उन संदर्भों में भी विस्तार करने का जोखिम है जहां उपनाम का कोई मतलब नहीं है।

आप सुडोल को एक शेल आह्वान करने के लिए कह सकते हैं sudo sh -c '…shell command here…':। आपके सामान्य उपनाम उस शेल कमांड के अंदर उपलब्ध नहीं होंगे, हालांकि, चूंकि वे आम तौर पर एक फ़ाइल में संग्रहीत होते हैं जैसे कि ~/.bashrcया ~/.zshrcजो केवल इंटरेक्टिव शेल द्वारा पढ़ा जाता है।

alias sudo='sudo ', जैसा कि रमेश द्वारा प्रस्तावित किया गया था , शेल के बाद उपनामों का विस्तार करने का कारण बनता है sudo


1
क्या alias sudo='sudo 'ZSH के लिए भी काम करता है ?
CMCDragonkai

2
@CMCDragonkai हां
गाइल्स '

1

Zsh उपयोगकर्ताओं के लिए एक समाधान

बाश और zsh दोनों में, एक स्थान के साथ एक उपनाम को समाप्त करने से शेल अगले शब्द को उपनाम-विस्तार कर देगा। यह निम्नलिखित की तरह कुछ और विस्तार करने की अनुमति देता हैmyalias

alias 'sudo=sudo '
sudo myalias

दुर्भाग्य से यह अलग हो जाता है जब आपके पास एक और शब्द होता है आपके उपनाम में (जैसे sudo -u someone। हालांकि आप कमांड में कहीं भी एलियास को मैन्युअल रूप से विस्तारित करने के लिए zsh "वैश्विक उपनाम" का दुरुपयोग कर सकते हैं।

alias -g '$= '

यह एक वैश्विक उपनाम $( जिसे आप चाहते हैं किसी भी शब्द का उपयोग कर सकते हैं) बनाता है जो एक अंतरिक्ष में समाप्त होता है। यह अगले शब्द को नियमित कमांड उपनाम के रूप में विस्तारित करने के लिए zsh का कारण बनता है। चूंकि उर्फ ​​व्हॉट्सएप का विस्तार करता है इसलिए इसे एक तर्क के रूप में नहीं माना जाएगा। यह निम्नलिखित को काम करने की अनुमति देता है।

% alias myalias=echo
% sudo -u someone myalias foo
sudo: myalias: command not found
% sudo -u someone $ myalias foo
foo

$यदि आपके पास जटिल कमांड नेस्टिंग है, तो आप एक कमांड लाइन पर कई बार भी उपयोग कर सकते हैं । मैंने इसे इतना उपयोगी पाया है कि मेरे zshrc में इसका एक स्थायी स्थान है, हालाँकि जब इसे उपयोग करने की आवश्यकता होती है, तो यह परिभाषित करने के लिए उर्फ ​​सरल है।


0

मैंने सिर्फ एक वैकल्पिक उत्तर दिया, यहांsudo एक उपनाम के साथ फिर से परिभाषित किए बिना ।

आपके मामले में यह होगा:

type -a startapp | grep -o -P "(?<=\`).*(?=')" | xargs sudo 

सभी एक पंक्ति में, कोई अतिरिक्त गोले नहीं, कोई अन्य उपनाम नहीं। ;-)


ओह, एक मिनट रुकिए - मुझे यह मिल गया है - आप xargsउद्धरण चिह्नों का उपयोग कर रहे हैं , और प्रमुख की पट्टी करने के लिए grep =। किंदा चतुर, लेकिन शायद अनावश्यक। eval "sudo $(alias aliasname | cut -d= -f2-)"बेहतर संभावना है - xargsहमेशा उद्धरणों को सही ढंग से नहीं संभालेंगे, और वहां एक से अधिक हो सकते हैं =
सुबह

@ मुझे लगता है आपको खेद है कि आप इसे प्राप्त नहीं कर पाए ;-) xargsउद्धरण नहीं छीनते । यह grep है जो उद्धरणों के बीच से हल की गई कमांड को लेता है। आपको पता है कि type -a alias_nameरिटर्न कुछ इस तरह है alias_name is aliased to command_within_quotes। वैसे मैं अपने आदेश की कोशिश की है और मेरे ubuntu :-( पर काम नहीं किया था यह की वापसी है। type -aLinux संस्करणों के बीच अलग (मैं यह शक है)?।
loved.by.Jesus

मुझे पता है कि क्या typeकरता है - में bash। आप हालांकि समझते हैं, कि उद्धरण कर रहे हैं दोगुनी है ना? क्या आपने इसे एक उपनाम के साथ आज़माया है जिसमें एकल उद्धरण हैं? वैसे भी, आप मेरी बात पर काम नहीं कर रहे हैं - आपको eval "sudo sh -c "$(...या तो इसकी आवश्यकता है eval "'sudo $(alias alias_name| cut -d\' -f2-)"। बात यह है aliasकि मूल रूप से खोजे गए हैं eval- aliasउपयोगिता उनकी सामग्री का उत्पादन करने के लिए है ताकि यह शेल के लिए सुरक्षित रूप से मजबूत हो सके। मुझे लगता है कि आपके xargsव्हाट्सएप को सपाट करने के लिए इसे लागू किया गया है? बस उस के साथ सावधान रहना, ठीक है?
mikeserv
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.