शेल में एक लाइन में कई कमांड चलाना


388

कहो कि मेरे पास एक फ़ाइल है /templates/appleऔर मैं चाहता हूं

  1. इसे दो अलग-अलग जगहों पर लगाएं और फिर
  2. मूल निकालें।

तो, /templates/appleकॉपी किया जायेगा /templates/usedऔर /templates/inuse और उसके बाद के बाद कि मैं मूल निकालना चाहते हैं।

क्या cpऐसा करने का सबसे अच्छा तरीका है, इसके बाद rm? या कोई बेहतर तरीका है?

मैं यह सब एक पंक्ति में करना चाहता हूं, इसलिए सोच रहा हूं कि यह कुछ ऐसा दिखाई देगा:

cp /templates/apple /templates/used | cp /templates/apple /templates/inuse | rm /templates/apple

क्या यह सही वाक्यविन्यास है?

जवाबों:


792

आप |एक कमांड के आउटपुट को दूसरे कमांड में निर्देशित करने के लिए (पाइप) का उपयोग कर रहे हैं । आप &&जिस चीज की तलाश कर रहे हैं, वह ऑपरेटर को अगले कमांड को निष्पादित करने के लिए है, अगर पिछले एक सफल हुआ:

cp /templates/apple /templates/used && cp /templates/apple /templates/inuse && rm /templates/apple

या

cp /templates/apple /templates/used && mv /templates/apple /templates/inuse

संक्षेप में (गैर-थकाऊ) बश के कमांड ऑपरेटर / विभाजक:

  • |पाइप (पाइपलाइन) stdoutएक कमांड के मानक आउटपुट ( ) दूसरे के मानक इनपुट में। ध्यान दें कि stderrअभी भी अपने डिफ़ॉल्ट गंतव्य में चला जाता है, चाहे कुछ भी हो।
  • |&दोनों एक stdoutऔर stderrएक के मानक इनपुट में एक कमांड के पाइप । बहुत उपयोगी, बैश संस्करण 4 और इसके बाद के संस्करण में उपलब्ध है।
  • &&&&यदि पिछले एक सफल रहा है केवल दाएं हाथ की कमान निष्पादित करता है ।
  • ||||केवल पिछले वाले के असफल आदेश को निष्पादित करता है ।
  • ;;पिछले आदेश के सफल या विफल होने की परवाह किए बिना हमेशा दाएं हाथ की कमांड निष्पादित करता है । जब तक set -eकि पहले चालान नहीं किया गया था, जो bashएक त्रुटि पर विफल हो जाता है।

6
Upvoted। आधिकारिक दस्तावेज़ीकरण gnu.org/software/bash/manual/bash.html#Lists
flow2k

78

cp1 को स्थान क्यों नहीं दिया गया, फिर mvस्थान 2 को। यह मूल को "हटाने" का ख्याल रखता है।

और नहीं, यह सही वाक्यविन्यास नहीं है। |एक कार्यक्रम से "पाइप" आउटपुट के लिए उपयोग किया जाता है और इसे अगले कार्यक्रम के लिए इनपुट में बदल दिया जाता है। आप ;जो चाहते हैं , वह कई कमांड को अलग करता है।

cp file1 file2 ; cp file1 file3 ; rm file1

यदि आपको आवश्यकता है कि व्यक्तिगत कमांड को अगले शुरू होने से पहले सफल होना चाहिए, तो आप उपयोग करेंगे && इसके बजाय :

cp file1 file2 && cp file1 file3 && rm file1

इस तरह, यदि दोनों में से कोई भी cpकमांड विफल रहता है, तो rmविल नहीं चलेगा।


10

ध्यान दें कि cp A B; rm Aवास्तव में है mv A B। यह और भी तेज़ होगा, क्योंकि आपको वास्तव में बाइट्स की प्रतिलिपि नहीं बनानी है (यह मानते हुए कि गंतव्य एक ही फाइल सिस्टम पर है), बस फ़ाइल का नाम बदलें। इसलिए आप यह चाहते हैंcp A B; mv A C


7

एक और विकल्प Ctrl+V Ctrl+Jप्रत्येक कमांड के अंत में टाइप कर रहा है ।

उदाहरण ( #साथ बदलें Ctrl+V Ctrl+J):

$ echo 1#
echo 2#
echo 3

आउटपुट:

1
2
3

यदि पिछले वाले विफल हुए तो यह कमांड निष्पादित करेगा।

के समान: echo 1; echo 2; echo 3

यदि आप विफल आदेशों पर निष्पादन रोकना चाहते हैं, &&तो पिछले एक को छोड़कर प्रत्येक पंक्ति के अंत में जोड़ें ।

उदाहरण ( #साथ बदलें Ctrl+V Ctrl+J):

$ echo 1 &&#
failed-command &&#
echo 2

आउटपुट:

1
failed-command: command not found

में zshभी आप का उपयोग कर सकते हैं Alt+Enterया के Esc+EnterबजायCtrl+V Ctrl+J


3

इसे इस्तेमाल करे..

cp /templates/apple /templates/used && cp /templates/apple /templates/inuse && rm /templates/apple


2

पाइप का उपयोग करना मुझे अजीब लगता है। वैसे भी आपको तार्किक andबैश ऑपरेटर का उपयोग करना चाहिए :

$ cp /templates/apple /templates/used && cp /templates/apple /templates/inuse && rm /templates/apples

यदि cpआदेश विफल होते हैं, तो rmनिष्पादित नहीं किया जाएगा।

या, आप forलूप का उपयोग करके अधिक विस्तृत कमांड लाइन बना सकते हैं और cmp

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