पूरे रास्ते को निर्दिष्ट किए बिना बैश बिलिन के बजाय सिस्टम कमांड का उपयोग करें


17

मैं बैश को अपने इंटरेक्टिव शेल के रूप में उपयोग करता हूं और मैं सोच रहा था कि क्या बैश को सिस्टम कमांड चलाने के बजाय शेल कमांड कमांड के स्थान पर चलाने के लिए एक आसान तरीका है जहां वे दोनों एक ही नाम साझा करते हैं।

उदाहरण के लिए, सिग्नल भेजने के बजाय नामित प्रक्रिया (तों) के प्रोसेस आईडी (पीआईडी) को प्रिंट करने के लिए सिस्टम kill(से util-linux) का उपयोग करें :

$ /bin/kill -p httpd
2617
...

सिस्टम कमांड के पूर्ण पथ को निर्दिष्ट किए बिना, सिस्टम कमांड के बजाय बैश बिलिन का उपयोग किया जाता है। killनिर्मित नहीं है -pतो आदेश विफल रहता है विकल्प:

$ kill -p httpd
bash: kill: p: invalid signal specification

मैंने मेक बैश में लिस्ट किए गए उत्तरों को बाहरी निर्मित 'टाइम' कमांड के बजाय शेल बिल्ट-इन का उपयोग करने की कोशिश की, लेकिन उनमें से ज्यादातर केवल इसलिए काम करते हैं क्योंकि timeवास्तव में शेल कीवर्ड है - शेल बिलिन नहीं

अस्थायी रूप से बैश बेसिन को निष्क्रिय करने के अलावा enable -n kill, मैंने अब तक जो सबसे अच्छा समाधान देखा है, वह है:

$(which kill) -p httpd

क्या अन्य आसान (कम टाइपिंग में शामिल) तरीके शेल शेल के बजाय बाहरी कमांड को निष्पादित करने के लिए हैं?

ध्यान दें कि killसिर्फ एक उदाहरण है और मैं एक सामान्यीकृत समाधान चाहूंगा जिस तरह से बिलिन के साथ उपसर्ग करना उन commandकार्यों को रोकता है जिनके पास बाहरी कमांड चलाने के समान नाम है। ज्यादातर मामलों में, मैं आमतौर पर बिलिन संस्करण का उपयोग करना पसंद करता हूं क्योंकि यह एक नई प्रक्रिया को बनाने के लिए बचाता है और कुछ समय में बिलिन में ऐसी विशेषताएं होती हैं जो बाहरी कमांड नहीं करता है।


बैकस्टिक्स which killमें संलग्न करना (उन्हें टिप्पणियों में नहीं डाल सकते) थोड़ा कम है।
अबला

@ बारबेक्यू अच्छी बात है। मैंने कमांड प्रतिस्थापन के लिए "नए" एर सिंटैक्स का उपयोग करने के लिए खुद को प्रशिक्षित करने में वर्षों का समय बिताया है। :)
एंथनी जी - मोनिका के लिए न्याय

@ सलाम: FYI करें, आप 'backticks' को backslashes (\) के साथ पूर्ववर्ती टिप्पणियों में डाल सकते हैं। लेकिन इसके साथ छड़ी करने के कारण हैं $(…)- यह , यह , और यह देखें
जी-मैन ने

जवाबों:


20

मान envलेना आपके रास्ते में है:

env kill -p http

env(संभवतः) संशोधित वातावरण में अपने पहले तर्क द्वारा नामित निष्पादन योग्य फ़ाइल चलाता है; जैसे, यह शेल निर्मित कमांड के बारे में नहीं जानता है या इसके बारे में काम नहीं करता है।

यह कुछ शेल जॉब कंट्रोल क्रॉफ्ट का उत्पादन करता है, लेकिन बाहरी कमांड पर निर्भर नहीं करता है:

exec kill -p bash &

execवर्तमान शेल को बदलने के लिए एक निष्पादन योग्य की आवश्यकता होती है, इसलिए किसी भी निर्मित-इन का उपयोग नहीं करता है। नौकरी पृष्ठभूमि में चलाई जाती है ताकि आप अपने वर्तमान शेल को नहीं बल्कि कांटेक्टेड बैकग्राउंड शेल को बदलें।


2
envस्पष्ट रूप से सही उत्तर IMHO है।
abligh

@ बार: आप मेरे हटाए गए उत्तर में टिप्पणी करने के लिए सही हैं। command -p cmdमें बाहरी आदेश कॉलिंग zsh, नहीं bash
क्यूंग्लम

6
(exec kill -p http)आपके वर्तमान शेल के बजाय एक उप-शेल को बदलने के लिए कार्य का कारण बनता है और आपको जॉब कंट्रोल क्रॉफ्ट से निपटने की आवश्यकता नहीं है।
माइकल हॉफमैन

1
@AnthonyGeoghegan दरअसल, envशेल शेल के बारे में भी नहीं पता है, क्योंकि यह शेल नहीं है। आप के साथ niceया xargsउस जैसे किसी भी अन्य कार्यक्रम के साथ एक ही प्रभाव मिलेगा ।
user253751

1

सबसे आसान तरीका है कि आप जो चाहते हैं वह लाइन डाल सकता है

alias kill="/bin/kill"

आपकी ~/.bashrcफ़ाइल में। उसके बाद, बैश के प्रत्येक नए लॉगिन / आह्वान के रूप में "मार" की व्याख्या होगी/bin/kill


मैं पहले से ही एक उपनाम के बारे में सोच चुका था और यह मेरे द्वारा जुड़े प्रश्न में सूचीबद्ध समाधानों में से एक था, लेकिन मैं commandप्रत्येक "छाया" कमांड के लिए एक अलग उपनाम बनाने के बजाय एक अधिक सामान्यीकृत समाधान (समाधान के समान ) की उम्मीद कर रहा हूं । मैंने अब इस स्पष्ट और अधिक स्पष्ट करने के लिए अपने प्रश्न को संपादित किया है। ज्यादातर मामलों में, मैं आमतौर पर बिलिन संस्करण का उपयोग करना पसंद करता हूं क्योंकि प्रक्रियाओं को नौकरी आईडी द्वारा निर्दिष्ट किया जा सकता है। फिर भी धन्यवाद।
एंथनी जी -

1

यदि आप एक समाधान जानते हैं जिसके लिए कुछ टाइपिंग की आवश्यकता होती है और आप एक ऐसा समाधान चाहते हैं जो कम टाइपिंग को पुन: उत्पन्न करे, तो इसका निर्माण करें:

runFile() { local cmd="$1"; shift; cmd="$(which "$cmd")" && "$cmd" "$@"; }

संक्षिप्त रूप से सामान जो सामान्य रूप से कुछ प्रयास करता है, वह है जो कंप्यूटर में उत्कृष्टता प्राप्त करता है।


1
यह एक अच्छा सामान्य बिंदु है इसलिए मैं आपके उत्तर को बढ़ा दूंगा। पिछले कुछ वर्षों में, मैंने सिस्टम के लिए उपनाम, फ़ंक्शंस और स्क्रिप्ट का एक संग्रह बनाया है जो मैं नियमित रूप से उपयोग करता हूं। हालांकि, मैं गैर-अनुकूलित समाधानों का उपयोग करना पसंद करता हूं, जहां संभव हो सके क्योंकि मुझे कभी-कभी ताजा इंस्टॉल या सर्वर पर काम करना पड़ता है जो मैंने सेट नहीं किया था। धन्यवाद।
एंथनी जी -

1

इस बहुत विशिष्ट मामले में, कमांड pgrep जरूरत के लिए एक सटीक मिलान है।

एक सामान्य अर्थ में, एक फ़ंक्शन काम करता है। "फ़ाइल कमांड" से:

fcmd(){ local a=$1; shift; $(which "$a") "$@"; }

के रूप में बुलाओ

fcmd kill -p httpd

लेकिन अगर आपको कम टाइपिंग की जरूरत है, तो एक अच्छे उपनाम से कम कोई रास्ता नहीं है।

अवधारणा "सूची पिड" (एलपी) से:

alias lp='/bin/kill -p'

फिर, बस टाइप करें:

lp httpd

0

(Zsh में) आप किसी भी कमांड नाम को एक अंतर्निहित चिह्न के बजाय सिस्टम संस्करण प्राप्त करने के लिए = चिह्न के साथ उपसर्ग कर सकते हैं। यह किसी भी उपनाम को चकमा देने का एक आसान तरीका है जो एक विशिष्ट परिदृश्य को गड़बड़ कर देता है।

$ =kill -p httpd

1
मैंने बैश संस्करण 4.3.30 के साथ कोशिश की और यह काम नहीं किया। मैंने पहले कभी ऐसा वाक्यविन्यास नहीं देखा है; क्या आप इस सुविधा के दस्तावेज़ में लिंक जोड़ सकते हैं? मैं आम तौर पर एक कमांड के गैर-अलियास संस्करण को चलाने के लिए एक बैकस्लैश के साथ एक उपनाम उपसर्ग करता हूं।
एंथनी जी -

@ एंथनी शायद यह zshकेवल एक चीज है। मैं इसे नियमित रूप से उपयोग करता हूं, लेकिन मैं bashकल एक कंप्यूटर से जांच करूंगा।
कालेब

मुझे संदेह था कि यह कुछ खोल हो सकता है जिससे मैं परिचित नहीं हूँ (मैं केवल बैश, डैश और csh से परिचित हूँ)। एक और जवाब था (डिलीट होने के बाद से) जिसने केवल काम किया zsh। जब मैंने इस प्रश्न को टैग bashकिया था और इसे शीर्षक में उपयोग किया था, तो आपको इस उत्तर को एक zsh उपयोगकर्ता के रूप में रखना चाहिए, फिर भी यह उपयोगी लगेगा।
एंथनी जी -

-1

आप अपने मेनपेज के खिलाफ एक बग्रेपोर्ट भेज सकते हैं killऔर पूछ सकते हैं कि इसमें गैर-मानक विकल्प क्यों शामिल हैं जो कि जब भी आपको पसंद हों, तब से pkillउपयोग pkillकर सकते हैं।pkill.

यदि आप फोन करते हैं:

pkill httpd

आप उन समस्याओं से बचते हैं जिनका आप वर्णन करते हैं।

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