टार और इसके प्रमुख अक्षर: क्या यह बग या फीचर है?


18

मैं इन दोनों आदेशों का अंतर पूछने के लिए सोच रहा हूं (अर्थात केवल उनके विकल्प के क्रम अलग हैं):

  1. tar -zxvf foo.tar.gz
  2. tar -zfxv foo.tar.gz

पहला वाला पूरी तरह से भाग गया लेकिन दूसरे ने कहा:

tar: You must specify one of the `-Acdtrux' or `--test-label'  options
Try `tar --help' or `tar --usage' for more information.

और के साथ टार --test-labelऔर -zfxvकहा:

tar (child): xv: Cannot open: No such file or directory
tar (child): Error is not recoverable: exiting now
tar: Child returned status 2
tar: Error is not recoverable: exiting now

तब मैंने टार मैनुअल को देखा और महसूस किया कि सभी उदाहरण -fअंत में स्विच का उपयोग कर रहे हैं !!

AFAICT इस प्रतिबंध के लिए कोई ज़रूरत नहीं है, या वहाँ है ?! क्योंकि मेरे विचार में स्विच निःशुल्क होना चाहिए।


2
@schily कमांड लाइनों के लिए आपका "सुधार" अस्पष्ट है कि वह वास्तव में किस कमांड को टाइप करता है। एक अलग डैश एक अलग तर्क पार्सर का उपयोग करने के लिए GNU टार के व्यवहार को बदलता है। कोई डैश (और इस प्रकार पारंपरिक तर्क पार्सर) का उपयोग करना, दूसरी कमांड ने काम किया होगा।
रैंडम 832

वेब सिस्टम से डेल्टा प्रिंटआउट ने मुझे बताया कि आपने या किसी ने जोड़ा था -, इसलिए मैंने उसे फिर से मिलान करने के लिए हटा दिया कि सिस्टम ने मुझे ओपी से क्या कहा था। लेकिन अगर आप सही हैं gtar option parsing, तो आपने gtar का उपयोग नहीं करने का एक और कारण खोजा।
शिल्पी

1
-fउम्मीद है कि फ़ाइल नाम का अनुसरण होगा। आपके दूसरे संस्करण में, आपने निर्दिष्ट किया -fxv, जो कि टार के लिए - इसका मतलब है कि फ़ाइल नाम "xv" है।
रॉल्फ

1
ऑब्जेगेटरी XKCD
पावेल

जवाबों:


11

आपके त्रुटि संदेश को देखते हुए, यह स्पष्ट है कि आपने उपयोग नहीं किया tar, बल्कि किया gtar

सामान्य तौर पर यह चीजों को समझने में मदद कर सकता है:

  • tarआम तौर पर हमेशा एक फ़ाइल तर्क की आवश्यकता होती है। यदि यह गायब है, तो यह सिस्टम के डिफॉल्ट रियल टेप डिवाइस को रीड / राइट करेगा। star1982 में डिफ़ॉल्ट रूप से स्टड / स्टडआउट का उपयोग करने के लिए इसे बदल दिया और कुछ अन्य टार कार्यान्वयन (उदाहरण के लिए gtar) ने हाल ही में इस उदाहरण का अनुसरण किया।

  • tarटार कमांड के मामले में -कहे key lettersजाने वाले विकल्पों के लिए अग्रणी को लागू नहीं करता है । कुछ कार्यान्वयन बाद में -उपयोगकर्ताओं की सुविधा के लिए एक नो-ऑप कुंजी पत्र के रूप में जोड़े गए , लेकिन आप इस पर भरोसा नहीं कर सकते।

  • जिस तरह से tarइसके तर्कों को (विशेष रूप से आर्काइव फ़ाइल के तर्क को) अत्यधिक जोखिम भरा माना जाता है। मैंने कई टार अभिलेखागार देखे हैं जो संग्रह में होनी चाहिए फ़ाइलों में से एक को नष्ट कर दिया क्योंकि संबंधित फ़ाइल तर्क को टार संग्रह फ़ाइल के रूप में लिया गया था। starइस कारण से (यदि मूल रूप से कहा जाता है star) "च" को अन्य विकल्पों के साथ समाहित नहीं होने देता है। यदि starइसे कहा जाता है, तो tarयह कमांड लाइन संगतता को लागू करता है tar, लेकिन फिर भी "f" कुंजी पत्र के लिए तर्क को अलग तरीके से संभालता है: तर्क को केवल तभी अनुमति दी जाती है यदि यह एक वास्तविक डिवाइस फ़ाइल को संदर्भित करता है या जब (लेखन मोड में) फ़ाइल अभी तक मौजूद नहीं है ।

मैं जोखिम भरा मूल टार कमांड लाइन से बचने की सलाह देता हूं और इसके बजाय आधुनिक सुरक्षित कमांड लाइन सिंटैक्स का उपयोग करता हूं star

समस्याग्रस्त कमांड लाइन सिंटैक्स की वजह से tar, tar wars1990 के दशक की शुरुआत में तथाकथित थे । नतीजतन, कार्यक्रम pax(टार युद्धों में "शांति" के लिए लैटिन) बनाया और मानकीकृत किया गया था। paxहालाँकि इसकी लोकप्रियता कम नहीं हुई क्योंकि इसका सिंटैक्स कम जोखिम भरा है लेकिन टार सिंटैक्स की तुलना में कम सहज है। एक और समस्या यह हो सकती है कि gpaxकम या ज्यादा अप्राप्य है।


3
टार के युद्ध खत्म हो गए हैं। गुंटार जीता।
यहोशू

2
यदि आप सही थे, तो सभी टार क्रियान्वयन सुविधाओं की नकल क्यों करते हैं star?
स्किल

1
BTW: टार युद्धों के बीच एक लड़ाई है tarऔर cpio
विद्वान

2
ठीक है, तो ऐसा लगता है star's -f"$file"भी (के अतिरिक्त है ind) के साथ शुरू फ़ाइल नाम के साथ एक समस्या =। इसलिए किसी को इसे लिखने की जरूरत है -f="$file"या -f "$file"। मुझे यकीन नहीं है कि मैं आपके स्टार विकल्प को सुरक्षित या आधुनिक कहूँगा ।
स्टीफन चेजलस

3
-longशैली लंबे विकल्प संघनित -xyzछोटे विकल्पों के साथ असंगत हैं या -xarg। यही कारण है कि X11 शैली के लंबे विकल्पों के लिए अलग-अलग होने के लिए छोटे विकल्पों की आवश्यकता होती है ( और -x -yनहीं -xy) और विकल्प तर्क अलग-अलग तर्क ( xterm -n foo, नहीं xterm -nfoo) पर होने चाहिए । और इसीलिए GNU लंबे विकल्पों में एक अतिरिक्त डैश है, छोटे विकल्पों के साथ संभावित भ्रम को दूर करने के लिए, और क्यों GNU- शैली लंबे विकल्प बेहतर डिज़ाइन हैं। -fooओवरलैप्स -x -y -xyसे बचने के लिए बहुत सावधानी बरतने पर ही आप सह-अस्तित्व रख सकते हैं ।
स्टीफन चेजलस

55

स्विच का क्रम मुफ़्त है, लेकिन -fएक अनिवार्य तर्क है जो फ़ाइल है जो tarपढ़ेगा / लिखेगा।

तुम यह कर सकते थे

tar -zf foo.tar.gz -xv

और वह काम करेगा, और स्विच की एक गैर-विशिष्ट क्रम की आपकी आवश्यकता है।

यह वह सभी कमांड है जिसमें विकल्प हैं जिनके पास तर्क काम करते हैं।


5
टार अन्य कमांड्स की तरह काम नहीं करता है क्योंकि यह एक बहुत पुरानी कमांड लाइन पार्सर का उपयोग करता है - वही जो "ar" कमांड और पुराने (प्री-पोसिक्स) "ps" कमांड में उपयोग किया जाता है।
schip

1
इसके लिए धन्यवाद, चयनित उत्तर, जबकि पूरी तरह से, ने मुझे वास्तव में यह देखने की अनुमति नहीं दी कि समस्या क्या थी। रेट्रोस्पेक्ट में, यह त्रुटि संदेश से स्पष्ट प्रतीत होता है कि
टारट

1
मेरा मानना ​​है कि आप इसे भी घोषित कर सकते हैं -f=./myfile, जैसा कि कहना है, च एक मूल्य लेता है, यह एक झंडा नहीं है, इसका इनपुट है।
थोरसुमोनर

14

परंपरागत रूप से, टार के विकल्प हैं और अधिक या कम "आदेश से मुक्त" (के आदेश fऔर bविकल्प बात करते हैं दोनों निर्दिष्ट कर रहे हैं)। हालांकि, एक प्रमुख डैश का उपयोग करना, GNU टार को अन्य कमांड्स के साथ अधिक सुसंगत माने जाने वाले तरीके से विकल्पों को पार्स करने का कारण बनता है, जहाँ एक विकल्प को निर्दिष्ट करना होता है जिसमें तर्क की आवश्यकता होती है (जैसे फ़ाइल नाम के लिए f) तुरंत बाकी "शब्द" का उपभोग करेगा। यदि कोई हो, तो तर्क के रूप में (परंपरागत रूप से, टार अगले शब्द का उपयोग फ़ाइल नाम / ब्लॉक के आकार के रूप में करता है जब fया bनिर्दिष्ट किया जाता है)। आपके मामले में, इसने फ़ाइल नाम के रूप में "xv" लिया।

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

यह टार मैनुअल सेक्शन "द थ्री ऑप्शन स्टाइल्स" में प्रलेखित है । कुछ अन्य कार्यान्वयन (जैसे FreeBSD) पुरानी शैली के विकल्प को "बंडल विकल्प शब्द" के रूप में संदर्भित करते हैं। और हां, कुछ कार्यान्वयन केवल इस प्रकार के विकल्प का समर्थन कर सकते हैं, और यदि शामिल हो तो डैश को अनदेखा कर सकते हैं या नहीं भी कर सकते हैं। यह एकल यूनिक्स विनिर्देश में निर्दिष्ट आह्वान का एकमात्र रूप है और इसलिए लगभग सभी प्रणालियों पर काम करने की गारंटी है।


2
ध्यान दें कि कुछ कार्यान्वयन तर्कों के साथ अन्य विकल्पों का समर्थन करते हैं (जैसे Cबीएसडी या जीएनयू टार। विद्वान टार-सी के रूप में इसका समर्थन करता है लेकिन सी के रूप में नहीं, सभी इसे -C के रूप में समर्थन करते हैं)।
स्टीफन चेज़लस

0

राल में, - स्विच में कई साल पहले पदावनत किया गया है और आवश्यक नहीं रह गया है। टार वास्तव में आपको बताता था लेकिन अब ऐसा नहीं है।

ie:
tar zxvf foo.tar.gz
tar zfxv foo.tar.gz

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