मैन पेज को pdf w / o tempfiles के रूप में प्रदर्शित करने के लिए प्रक्रिया प्रतिस्थापन (या समान) का उपयोग करना


0

मेरे पास एक पीडीएफ में, पोस्टस्क्रिप्ट के रूप में प्रदान किए गए पृष्ठों को प्रदर्शित करने के लिए एक बश फ़ंक्शन है:

function psman () {
    man -t "$@" | ps2pdf - /tmp/manpage.pdf
    evince /tmp/manpage.pdf
}

( अद्यतन करें : मैंने परिधीय जटिलताओं को डायनामिक रूप से अस्थायी फ़ाइल नाम बनाने और 'nohup' का उपयोग करके छीन लिया

यह ठीक काम करता है। उपयोग में इसके स्क्रीनशॉट के लिए, देखें https://www.tartley.com/postscript-formatted-man-pages

अपने स्वयं के संपादन के लिए, मैंने टेंपफाइल्स का उपयोग किए बिना इसे लागू करने का प्रयास किया। उदाहरण के लिए, प्रक्रिया प्रतिस्थापन का उपयोग कर:

$ evince <(man -t ls | ps2pdf - -)

यह काम नहीं करता है। एवियन अपने GUI में एक त्रुटि प्रदर्शित करता है:

Unable to open document "file:///dev/fd/63".
PDF document is damaged

क्यूं कर? बिना किसी इंटरमीडिएट फाइल को जनरेट किए मैं पीडीएफ कैसे बना और देख सकता हूं?

उपरोक्त त्रुटि संदेश गुम या खाली फ़ाइलों के लिए दिखाए जाने वाले संदेशों की तुलना में भिन्न है, इसलिए यह बस ऐसा नहीं है।

अद्यतन करें: अधिक जानकारी प्राप्त करने के लिए, मैंने more ls ’के साथ more इवियर्स’ को बदलने की कोशिश की:

$ ls -l <(man -t ls | ps2pdf - -)
lr-x------. 1 jhartley jhartley 64 Aug 23 08:59 /dev/fd/63 -> pipe:[196475]

जहां रंग बिरंगे कपड़े हैं:

  • /dev/fd/63 'ORPHAN' के रूप में (एक सांकेतिक लिंक जो कि एक बिना फ़ाइल वाली फ़ाइल की ओर इशारा करता है), और
  • pipe:[196475] 'मिसिंग' के रूप में (एक प्रतीकात्मक लिंक द्वारा इंगित की गई कोई भी फ़ाइल)

तो हो सकता है कि ईविल को सिर्फ एक फ़ाइल की ओर इशारा करते हुए एक लिंक दिया जा रहा है जो मौजूद नहीं है? इसकी नक़ल करने के लिए, मैंने एक प्रतीकात्मक लिंक बनाया, जो एक बिना किसी फ़ाइल की ओर इशारा करता है, फिर इसे 'इवन' के साथ खोला। लेकिन ऊपर दिए गए 'पीडीएफ क्षतिग्रस्त है' संदेश के बजाय, यह मुझे "ऐसी कोई फ़ाइल या निर्देशिका नहीं देता है।"

अद्यतन करें: मुझे लगता है कि ORPHAN / MISSING फाइलिंग एक लाल हेरिंग है। मैं एक ही साधारण प्रक्रिया प्रतिस्थापन करते समय एक ही ORPHAN / MISSING सिम्कल देखता हूं:

$ ls -l <( echo 123 )

और उसी का उपयोग करते हुए man|ps2pdt पाइपलाइन ठीक काम करता है जब प्रक्रिया प्रतिस्थापन खिलाया जाता है diff:

$ diff <(man -t ls | ps2pdf - - | tr "\0" "0") <(man -t ls | ps2pdf - - | tr "\0" "0")
248c248
< /ID [<95A81B38FAE8E6FE3C899586A1DEE861><95A81B38FAE8E6FE3C899586A1DEE861>]
---
> /ID [<2F9164BD9265C8540A4A8E7068076344><2F9164BD9265C8540A4A8E7068076344>]

(यहां मैंने पीडीएफ आउटपुट में अशक्त / शून्य वर्णों को समाप्त करने के लिए पाइपलाइनों में to ट्र ’’ जोड़ा है, जिससे फाइलों को द्विआधारी के बजाय पाठ के रूप में माना जाएगा।)

तो, सारांश में, मुझे नहीं पता कि मुझे ऊपर "पीडीएफ क्षतिग्रस्त है" त्रुटि क्यों है। मेरा लक्ष्य, समझ के अलावा, रास्ते में किसी भी फाइल को उत्पन्न किए बिना उत्पन्न पीडीएफ को देखना है।


मुझे लगने लगा है कि मेरी समस्या उसी तरह से है जिस तरह से खुद को खोलना और फाइलों से पढ़ना पढ़ता है। अन्य उपकरण (जैसे कि ऊपर वर्णित 'अंतर') समस्या के बिना मेरी प्रक्रिया प्रतिस्थापन के परिणामस्वरूप फ़ाइल नाम को खोलने के लिए लगता है।
Jonathan Hartley

मुझे लगता है कि evince <( cat man-ls.pdf ) त्रुटियों के बिना खुलता है, 4 पृष्ठ (सही संख्या) प्रदर्शित करता है, लेकिन सभी पृष्ठ रिक्त हैं। जैसे यह आंशिक रूप से फ़ाइल को सफलतापूर्वक पढ़ता है, लेकिन फिर कुछ बिंदु पर विफल रहा है।
Jonathan Hartley

मुझे लगता है कि शायद मुझे यह करना चाहिए था unix.stackexchange.com
Jonathan Hartley

जवाबों:


1

बस एक अनुमान है, लेकिन प्रशंसनीय एक:

evince "फ़ाइल" के माध्यम से खोजता है, जो धारा उसे मिलती है वह खोजी नहीं है। तुलना कुछ आदेशों के साथ BASH प्रक्रिया प्रतिस्थापन कार्य क्यों नहीं करता है?

इसका मतलब यह है कि यह (लगभग?) असंभव है जिसे आप किसी भी मध्यवर्ती फ़ाइल के बिना प्राप्त करना चाहते हैं। मैं जो सबसे अच्छा सोच सकता हूं वह इस तरह से एक स्क्रिप्ट है:

#!/bin/bash

tmpd="/dev/shm"

( tmpf="$(mktemp -p "$tmpd" "tmp [man $*] XXX.pdf")"
man -t "$@" | ps2pdf - > "$tmpf"
evince "$tmpf"
rm "$tmpf" ) 2>/dev/null &

टिप्पणी, नुकसान आदि:

  1. कब $tmpd है /dev/shm, एक अस्थायी फ़ाइल बनाई गई है याद में । मुझे लगता है कि यह "किसी भी मध्यवर्ती फ़ाइलों को उत्पन्न किए बिना" के करीब है जैसा कि आप इसे आसानी से प्राप्त कर सकते हैं, जबकि इसे खोजने योग्य रखते हुए।
  2. चाहे कुछ भी हो, हमें इसे बाद में हटा देना चाहिए। यदि स्क्रिप्ट बाधित है (उदाहरण के लिए) Ctrl + सी ) के बीच mktemp तथा rm, फ़ाइल बच जाती है और हम इसे नहीं चाहते हैं। इस समस्या के कुछ दृष्टिकोण हैं, आप कर सकते हैं trap संकेत यदि आप चाहते हैं; मैंने पृष्ठभूमि में पूरे अनुक्रम को चलाने के लिए चुना ( ( … ) & ) जो काफी अच्छा हो सकता है।
  3. मेरे evince से कोई फ़ाइल नहीं खोलेगा /dev/shm जब तक इसका नाम खत्म नहीं होता .pdf (यह व्यवहार असंवेदनशील है)। इसलिए वहाँ है .pdf फ़ाइल नाम टेम्पलेट में। इसमें ऐसी कोई समस्या नहीं है /tmp। क्यूं कर? मुझे नहीं पता।
  4. फ़ाइल नाम टेम्पलेट के साथ बनाया गया है $* इसमें इसे कुछ सार्थक बनाने के लिए (यह शीर्षक में पता चलता है evince खिड़की)।

इसके बहुत सारे अर्थ निकलते हैं। लिंक के लिए धन्यवाद। मैंने आज कुछ सीखा।
Jonathan Hartley

1

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

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

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


-1

उदाहरण के उपयोग के लिए आपको केवल फ़ाइल नाम जोड़ना होगा:

(man -t ls | ps2pdf - ~/man_ls.pdf) > evince

यह बनाने जा रहा है man_ls.pdf अपने घर निर्देशिका में फ़ाइल


विचारों के लिए धन्यवाद, लेकिन मुझे अभी तक समझ में नहीं आया है। क्या आप वाकई '& gt;' उस बैश के अंत के पास? यह एक खाली फाइल लिखता है, जिसे 'ईवियन' कहा जाता है।
Jonathan Hartley

याद रखें, मेरा लक्ष्य पीडीएफ पर 'एवेरियन' (एक सूक्ति पीडीएफ दर्शक) नामक कार्यक्रम को चलाना है, बिना किसी भी तरह की फाइलों को लिखने के।
Jonathan Hartley

मैं क्षमाप्रार्थी हूं। मैं इस जवाब को नीचे चिह्नित करने जा रहा हूं क्योंकि कमांड काम नहीं करता है, और स्पष्टीकरण मेरे प्रश्न को संबोधित करने के लिए प्रकट नहीं होता है। माफी माँगता हूँ अगर मैं गलत कर रहा हूँ।
Jonathan Hartley

आप किसी भी फ़ाइल का उपयोग किए बिना एक पीडीएफ फाइल लिखने का प्रयास क्यों कर रहे हैं? यदि आप अस्थायी फ़ाइलों या किसी भी फ़ाइल को प्राप्त करने की कोशिश नहीं कर रहे हैं, तो आपकी जानकारी कहीं न कहीं संग्रहीत होनी चाहिए।
Genaro Morales

हे गेनारो। इसे करने के लिए बैश दृष्टिकोण एक सुविधा है, जिसे प्रक्रिया प्रतिस्थापन कहा जाता है, का उपयोग करते हुए cmd1 <( cmd2 ) वाक्य - विन्यास। की स्टडआउट cmd2 (मेरे उदाहरण में, ps2pdf) एक पाइप में जाता है, और उस पाइप को फाइलसिस्टम पर एक नाम दिया जाता है, और उस नाम को cmd1 (मेरे उदाहरण में, evince) में पास किया जाता है। cmd1 उस फ़ाइलनाम को खोल सकता है जिसे यह दिया गया था, इसे पढ़ें, और cmd2 का स्टडआउट प्राप्त करता है। न तो कॉमैंड के पास कोई विचार है कि प्रक्रिया प्रतिस्थापन का उपयोग किया जा रहा है। हालाँकि, किसी भी बिंदु पर बैश डिस्क पर बाइट नहीं लिखता है। यह सभी इन-मेमोरी, बहुत कुछ पुनर्निर्देशन की तरह है & amp; पाइप। बिंदु प्रदर्शन के लिए है, & amp; व्यक्तिगत शिक्षा।
Jonathan Hartley
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.