कमांड से फाइल और आउटपुट कैसे अलग करें?


32

आम तौर पर आप लिखेंगे:

diff file1 file2

लेकिन मैं कमांड से एक फ़ाइल और आउटपुट को अलग करना चाहूंगा (यहां मैं कमांड को एक तुच्छ बनाता हूं):

diff file1 <(cat file2 | sort)

ठीक है, यह काम जब मैं इसे शेल प्रांप्ट पर मैन्युअल रूप से दर्ज करता हूं, लेकिन जब मैं शेल स्क्रिप्ट में एक ही लाइन डालता हूं, और फिर स्क्रिप्ट चलाता हूं, तो मुझे त्रुटि मिलती है।

तो, सवाल है - यह सही तरीके से कैसे करें?

बेशक मैं एक अस्थायी फ़ाइल में आउटपुट लिखने से बचना चाहूंगा।

जवाबों:


39

मुझे आपकी स्क्रिप्ट पर शक है और आपका खोल अलग है। शायद आप #!/bin/shदुभाषिया के रूप में अपनी स्क्रिप्ट के शीर्ष पर हैं लेकिन आप bashअपने व्यक्तिगत शेल के रूप में उपयोग कर रहे हैं। आप पता लगा सकते हैं कि आप टर्मिनल में किस शेल को चलाते हैं echo $SHELL

ऐसा करने का एक आसान तरीका जो अधिकांश गोले में काम करना चाहिए वह आपके द्वारा दिए गए फ़ाइल रीड ऑपरेटर के बजाय एक पाइप रीडायरेक्ट का उपयोग करना होगा। प्रतीक '-' एसटीडीआईएन पढ़ने के लिए एक मानक नामकरण है और अक्सर एक तर्क सूची में फ़ाइल नाम के प्रतिस्थापन के रूप में इस्तेमाल किया जा सकता है:

cat file2 | sort | diff file1 -

या बिल्ली के बेकार उपयोग से बचने के लिए :

sort < file2 | diff file1 -

आह, तुम अच्छे हो, वास्तव में, मैंने जांच नहीं की कि शश है या नहीं। समाधान के लिए बहुत-बहुत धन्यवाद।
ग्रीनल्डमैन

यह फ़ाइल को स्टडआउट के साथ अलग कर रहा है। अब एक फाइल के साथ stdout कैसे अलग करें? मेरा मतलब है, विपरीत दिशा। यह है -Rका उपयोग कर के मामले मेंgit diff --no-index
Nakilon

@Nakilon आप सिर्फ तर्क क्रम को बदलेंगे diff - file1:।
कालेब

ठंडा। यह काम नहीं किया git diff
नकीलोन

@ नाकिलन बेशक, ऐसा क्यों करेगा? git diffएक पूरी तरह से अलग जानवर है और इसके आंतरिक सूचकांक में ग्लोब ऑब्जेक्ट्स के संदर्भ में संचालित होता है, न कि फाइलें; diffफाइल सिस्टम पर काम करता है। -वाक्य रचना बस के लिए वाक्यात्मक चीनी शैल है /dev/stdin, फ़ाइल STDIN धारा का प्रतिनिधित्व। इसलिए diffइसका उपयोग फ़ाइल नाम के विकल्प के रूप में क्यों किया जा सकता है। इस बीच git diffफ़ाइलों की तलाश नहीं है, यह वस्तुओं को देख रहा है इसलिए आपको इसे कुछ ऐसा करना होगा जो इसे पहचानता है। फ़ाइलों को एक दूसरे से तुलना करने के लिए इसका उपयोग न करें, इसके लिए उपयोग करें diff
कालेब

-4

मानक इनपुट का दायरा इसकी लिपि ही है, इसलिए अपना कोड इस तरह से एक ब्लॉकू के अंदर रखें:

{
  diff file1 <(sort file2)
}

इस तरह STDIN का दायरा ब्लॉक के अंदर है।

मैंने कोशिश की है और यह काम करता है।


यह एक फ़ंक्शन नहीं है, यह एक ब्लॉक है, और इससे कोई फर्क नहीं पड़ता।
गिल्स एसओ- बुराई को रोकना '

@gilles सुधार के लिए Thx। BTW मैं खुद की कोशिश की है और यह काम करता है। क्या तुमने किया?
tmow

3
ब्लॉक की <(…)निर्माण की वैधता पर कोई प्रभाव नहीं पड़ता है । आपकी स्क्रिप्ट काम करेगी या नहीं, यह इस बात पर निर्भर करता है कि आप इसे शेल में चलाते हैं जो समर्थन करता है <(…)या नहीं (ksh93 / bash / zsh vs Bourne / ash / kshk88)। कालेब का जवाब यह सब नाखून।
गिलेस एसओ- बुराई को रोकना '

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