2011-01-03 15 views
21

मैं एक कमांड को चलाने के लिए प्रत्येक आदेश, उपयोगकर्ता द्वारा दर्ज करने के बाद उदाहरणकंसोल से दर्ज प्रत्येक बैश कमांड से पहले या उसके बाद कुछ कमांड कैसे चलाएं?

echo "foobar"; 

के लिए, चाहते हैं।

दो परिदृश्यों:

  • उपयोगकर्ता एक आदेश में प्रवेश करती है, मेरे वैश्विक आदेश निष्पादित किया जाना चाहिए, और बाद में अपने आदेश
  • उपयोगकर्ता एक आदेश प्रवेश करती है, अपने आदेश निष्पादित किया जाना चाहिए निष्पादित किया जाना चाहिए, और बाद में मेरा वैश्विक आदेश

उपर्युक्त दो परिदृश्यों को कैसे पूरा किया जाना चाहिए?

एनबी: मैं इस उद्देश्य के लिए प्रॉम्प्ट का उपयोग नहीं करना चाहता, (पीएस 1 वैरिएबल को छोड़ दें)।

+4

@ajreal, कैसे उर्फ:

अपना पहला अनुरोध करने के लिए, आप DEBUG छद्म संकेत trap कर सकते हैं? क्या मुझे हर आज्ञा का उपनाम करना चाहिए? – astropanic

+2

आप स्पष्ट समाधान का उपयोग क्यों नहीं करना चाहते हैं? आप हमेशा अपना खुद का खोल लिख सकते हैं जो आप चाहते हैं। –

उत्तर

15

जैसा कि l0b0 सुझाव देता है, आप अपना दूसरा अनुरोध करने के लिए PROMPT_COMMAND का उपयोग कर सकते हैं और आपको PS1 को स्पर्श नहीं करना होगा।

trap 'echo "foobar"' DEBUG 
+0

मुझे जाल चाल का उपयोग करने के लिए कोड को एक बार पहले और आदेश के चार बार बाद निष्पादित करता है। – trusktr

+0

@trusktr: इसका शायद मतलब है कि आपके पास कुछ आदेश चलाने के लिए 'PROMPT_COMMAND' सेट है। दुर्भाग्यवश, क्योंकि आदेशों से पहले 'DEBUG' जाल निष्पादित होता है, इसलिए आप अपने 'PROMPT_COMMAND' की शुरुआत में जाल को बंद नहीं कर सकते हैं और अंत में वापस बंद कर सकते हैं क्योंकि इसे बंद करने के लिए आदेश इसे ट्रिगर करेगा। –

+0

यिक्स। वह बदसूरत है। मैं कुछ लागू करने की कोशिश कर रहा हूं ताकि मेरा बैश इतिहास टर्मिनल के बीच सिंक्रनाइज़ किया जा सके, लेकिन इससे कोई फर्क नहीं पड़ता कि मैं ऐसा करता हूं, मैं इसे नहीं कर सकता। मैंने सोचा कि अगर प्री-कमांड सुविधा को लागू करने का कोई तरीका है (जैसे इस जाल उदाहरण) तो मैं दूसरे टर्मिनल के अंतिम कमांड के आधार पर इतिहास को ताज़ा करने के लिए मजबूर कर सकता हूं। अब तक, मुझे विभिन्न विधियां मिली हैं जो HISTFILE को लिखने के लिए PROMPT_COMMAND का उपयोग करती हैं, फिर इतिहास को रीफ्रेश करें, लेकिन यह कम से कम एक कमांड निष्पादित होने तक कम से कम एक कमांड निष्पादित होने तक अन्य टर्मिनल में दिखाई नहीं देता है (कम से कम एक बार एंटर दबाएं)। – trusktr

8

दूसरे भाग के लिए आप declare -r PROMPT_COMMAND="echo 'foobar'" का उपयोग कर सकते हैं: इसे तुरंत प्रदर्शित होने से पहले निष्पादित किया जाता है। सावधान रहें कि यह प्रत्येक कमांड के लिए नहीं चलाया जाएगा उदाहरण के लिए एक पाइप या कमांड समूह।

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

+0

मैं अनुशंसा करता हूं कि यह केवल पढ़ने के लिए न हो। इसके अलावा, आप भागने को खत्म कर सकते हैं: '... =' echo "foobar" ' –

+0

शायद यह स्पष्ट है, लेकिन उपयोगकर्ता वास्तव में प्रवेश करने के बाद यह वास्तव में वैश्विक आदेश नहीं चलाता है; यह पहले उपयोगकर्ता कमांड खत्म करने के लिए इंतजार कर रहा है। –

संबंधित मुद्दे