কীভাবে বাশের প্রক্রিয়া বিকল্পটি এখানে-ডকুমেন্টের সাথে সংযুক্ত করবেন?


14

বাশ সংস্করণে ৪.২.৪7 (১) - দয়া করে যখন আমি এখানে হর-ডকুমেন্ট থেকে আসে এমন ফর্ম্যাট পাঠ্যটি কেটেট করার চেষ্টা করি:

cat <(fmt --width=10 <<FOOBAR
(I want the surrounding parentheses to be part of the HERE-document)
(Even the preceding unbalanced parenthesis should be part of it.
FOOBAR
) # I want this paranthesis to end the process substitution.

আমি নিম্নলিখিত ত্রুটি পেয়েছি:

bash: bad substitution: no closing `)' in <(fmt --width=10 <<FOOBAR
(I want the surrounding parentheses to be part of the HERE-document)
(Even the preceding unbalanced parenthesis should be part of it.
FOOBAR
)

এছাড়াও আমি এখানে ডকুমেন্টটি উদ্ধৃত করতে চাই না, অর্থাত্ লিখি <'FOOBAR', কারণ আমি এখনও তার মধ্যে ভেরিয়েবলগুলি প্রতিস্থাপন করতে চাই।


আপনার কি সত্যিই catকল দরকার ? কেন ডাকলে ছাড়বেন না fmt?
ইরুবার

2
আমাকে অবশ্যই স্বীকার করতে হবে এটি একটি স্বতন্ত্র উদাহরণ। আমার আসল চাহিদা এর চেয়ে জটিল।
টিম ফ্রিস্ক

1
এটি আকর্ষণীয় যে আপনি যখন এটি প্রতিস্থাপন (Evenকরেন "(Even"তখন কাজ করে। এটা একই \(Even। দেখতে পার্সিং বাগের মতো। বাশ এখনও একটি প্রসঙ্গে রয়েছে যখন তারা ব্রেসগুলি খুঁজছিল এবং এখানে ডকটি পড়ার প্রসঙ্গে এবং উভয় প্রসঙ্গই একে অপরের বিরোধিতা করে।
রাফেল অ্যারেনস

1
bashঘটনাচক্রে এটি ৪.৩ এ স্থির করা হয়েছে।
চিপনার

উত্তর:


7

প্রক্রিয়া প্রতিস্থাপন এটি প্রায় সমতুল্য।

উদাহরণ - প্রক্রিয়া প্রতিস্থাপনের মেকানিক্স

পদক্ষেপ # 1 - একটি ফিফো তৈরি করুন, এটিতে আউটপুট

$ mkfifo /var/tmp/fifo1
$ fmt --width=10 <<<"$(seq 10)" > /var/tmp/fifo1 &
[1] 5492

পদক্ষেপ # 2 - ফিফোটি পড়ুন

$ cat /var/tmp/fifo1
1 2 3 4
5 6 7 8
9 10
[1]+  Done                    fmt --width=10 <<< "$(seq 10)" > /var/tmp/fifo1

HEREDOC এর মধ্যে পেরেনের ব্যবহারও ঠিক আছে বলে মনে হচ্ছে:

উদাহরণ - কেবল একটি ফিফো ব্যবহার করা

পদক্ষেপ # 1 - FIFO এ আউটপুট

$ fmt --width=10 <<FOO > /var/tmp/fifo1 &
(one)
(two
FOO
[1] 10628

পদক্ষেপ # 2 - ফিফোর সামগ্রীগুলি পড়ুন

$ cat /var/tmp/fifo1
(one)
(two

সমস্যাটি, আমি বিশ্বাস করি যে আপনি এটি চালাচ্ছেন এটি হ'ল প্রক্রিয়া প্রতিস্থাপন, এর <(...)মধ্যে প্যারেন্সের বাসা বাঁধার যত্ন নেবে বলে মনে হয় না।

উদাহরণ - প্রক্রিয়া সাব + হারডোক কাজ করে না

$ cat <(fmt --width=10 <<FOO
(one)
(two
FOO
)
bash: bad substitution: no closing `)' in <(fmt --width=10 <<FOO
(one)
(two
FOO
)
$

প্যারেনগুলি ছেড়ে যাওয়া এটিকে তুষ্ট করার মতো মনে হচ্ছে, একটু:

উদাহরণ - পেরেন্স পলায়ন

$ cat <(fmt --width=10 <<FOO                 
\(one\)
\(two
FOO
)
\(one\)
\(two

কিন্তু সত্যিই আপনি যা চান তা আপনাকে দেয় না। প্যারেন্সকে ভারসাম্যযুক্ত করাও এটিকে সন্তুষ্ট বলে মনে হয়:

উদাহরণ - ভারসাম্য প্যারেন্স

$ cat <(fmt --width=10 <<FOO
(one)
(two)
FOO
)
(one)
(two)

আমার যখনই জটিল স্ট্রিং রয়েছে যেমন বাশের সাথে লড়াইয়ের জন্য, আমি প্রায়শই সর্বদা এগুলি প্রথমে তৈরি করব, একটি ভেরিয়েবলের মধ্যে সঞ্চয় করে রাখব এবং তারপরে এগুলি ভেরিয়েবলের মাধ্যমে ব্যবহার করব, চেষ্টা করার পরিবর্তে কিছু জটিল একটি লাইনার তৈরি করার চেষ্টা করবো যা শেষ হয়ে যায় that ভঙ্গুর.

উদাহরণ - একটি ভেরিয়েবল ব্যবহার করুন

$ var=$(fmt --width=10 <<FOO
(one)
(two
FOO
)

তারপরে এটি মুদ্রণ করতে:

$ echo "$var"
(one)
(two

তথ্যসূত্র


3

এটি কেবল একটি কাজ। পাইপ fmtথেকে catপ্রক্রিয়া প্রতিকল্পন ব্যবহার পরিবর্তে

fmt --width=10 <<FOOBAR | cat 
(I want the surrounding parentheses to be part of the HERE-document)
(Even the preceding unbalanced parenthesis should be part of it.
FOOBAR

1
আমি আপনার "workaround" চেষ্টা করেছিলাম এবং এটি আমার জন্য কার্যকর হবে। ধন্যবাদ। তবে তবুও আমি বুঝতে পারি যে কেন একটি প্রক্রিয়া প্রতিস্থাপনের অভ্যন্তরে আমার এখানে HERE-ডকুমেন্টের সংমিশ্রণ কাজ করে না। উত্তর পেয়েছেন?
টিম ফ্রিস্ক

@ টিমফ্রিসকে, আমি bashএই সাইটের যেকোন একটি উইজার্ডকে স্থগিত করতে যাচ্ছি । বাশ পার্সার ইন্টার্নাল সম্পর্কে আমার জ্ঞানটি কমপক্ষে বলতে সীমাবদ্ধ
ইরুবার

2

এটি একটি পুরানো প্রশ্ন, এবং আপনি যেমন বুঝতে পেরেছেন যে এটি একটি দ্বন্দ্বযুক্ত উদাহরণ (এবং এইভাবে সঠিক সমাধানটি ব্যবহার করা cat |বা আসলে catএই ক্ষেত্রে মোটেই নেই), আমি কেবলমাত্র সাধারণ ক্ষেত্রে আমার উত্তর পোস্ট করব। আমি এটি কোনও ফাংশনে রেখে এবং পরিবর্তে এটি ব্যবহার করে সমাধান করব।

fmt-func() {
    fmt --width=10 <<FOOBAR
(I want the surrounding parentheses to be part of the HERE-document)
(Even the preceding unbalanced parenthesis should be part of it.
FOOBAR
}

এবং তারপরে এটি ব্যবহার করুন

cat <(fmt-func)

ধন্যবাদ! ঠিক আমি খুঁজছেন ছিল কি.
পাইরেস্টন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.