একটি বংশানুক্রমিক পাইপ জন্য বহু লাইন সিনট্যাক্স; এই বহনযোগ্য?


132

আমি এই সিনট্যাক্সের সাথে পরিচিত:

cmd1 << EOF | cmd2
text
EOF

তবে সবেমাত্র আবিষ্কার হয়েছে যে বাশ আমাকে লেখার অনুমতি দেয়:

cmd1 << EOF |
text
EOF
cmd2

(হেরেডোকটি সিএমডি 1 এ ইনপুট হিসাবে ব্যবহৃত হয় এবং সেন্টিমিডি 1 এর আউটপুটটি সেন্টিমিডি 2 তে পাইপ করা হয়)। এটি একটি খুব বিজোড় বাক্য গঠন বলে মনে হচ্ছে। এটা কি বহনযোগ্য?


আমি একাধিক লাইন মধ্যে বিভাজন এই একটি ভাল উপায় খুঁজে বের করতে এখানে এসেছে: big-long-command1 with lots of args << EOF | big-long-command2 with lots of args। "বিজোড় সিনট্যাক্স" মনে হচ্ছে সেরা উপায়।
পলিসি

এর জন্য একটি সুবিধাজনক ব্যবহারের ক্ষেত্রটি হ'ল আপনি যখন টেবিল-বিস্মৃত এমন একটি টেবিলকে স্থান-সীমিত স্থানকে রূপান্তরিত করার চেষ্টা করছেন যাতে আপনি এটি Google স্প্রেডশিটে পেস্ট করতে পারেন। আপনাকে একটি অস্থায়ী ফাইল তৈরি করতে হবে না।
শ্রীধর সারনোবাত

1 ম আমার জন্য জেড শেলটিতে কাজ করেনি। আমি ২ য়টি পছন্দ করি না কারণ এটি | কমান্ডটি থেকে, শেল পাইপলাইনের idiomacy (?) হারিয়েছে।
শ্রীধর সারনোবাত

উত্তর:


104

হ্যাঁ, পসিক্স মানটি এটির অনুমতি দেয়। ২০০৮ সংস্করণ অনুসারে:

এখানে-দলিলটি একক শব্দের হিসাবে বিবেচিত হবে যা পরের পরে শুরু হয় <newline>এবং অবধি অবধি অবধি অবধি অবধি অবধি অবধি চলতে থাকবে যতক্ষণ না এর মধ্যে <newline>কোন <blank>অক্ষর নেই । তারপরে পরবর্তী এখানে-নথিটি শুরু হয়, যদি একটি থাকে।

এবং একই লাইনে একাধিক "এখানে-নথি" এর উদাহরণ অন্তর্ভুক্ত করেছে:

cat <<eof1; cat <<eof2
Hi,
eof1
Helene.
eof2

সুতরাং পুনঃনির্দেশগুলি বা পাইপগুলি করতে কোনও সমস্যা নেই। আপনার উদাহরণটি এরকম কিছুটির সাথে মিল:

cat file |
cmd

এবং শেল ব্যাকরণ (সংযুক্ত পৃষ্ঠায় আরও নিচে) এই সংজ্ঞাগুলি অন্তর্ভুক্ত করে:

pipe_sequence    :                             command
                 | pipe_sequence '|' linebreak command

newline_list     :              NEWLINE
                 | newline_list NEWLINE
                 ;
linebreak        : newline_list
                 | /* empty */

সুতরাং একটি পাইপ প্রতীক অনুসরণ করার পরে একটি লাইন শেষ হতে পারে এবং এখনও একটি পাইপলাইনের অংশ হিসাবে বিবেচনা করা যেতে পারে।


26

হ্যাঁ এটি পসিক্স শেল ব্যাকরণে রয়েছে। এছাড়াও আপনি থাকতে পারে একই কমান্ডের জন্য একটির বেশি এখানে-ডক (কিছু অন্যান্য উদাহরণ দুই ব্যবহার cat, আমন্ত্রণ কিন্তু ভাল হিসাবে এই কাজ):

cat <<EOF1 <<EOF2
first here-doc
EOF1
second here-doc
EOF2

এটি স্বীকৃত (স্টিডিনের জন্য এখানে 2 টি ডকস ব্যবহার করে), তবে আপনি যদি বিভিন্ন ফাইল বর্ণনাকারীর জন্য ইনপুট সরবরাহ করার কথা মনে করেন তবে তা অবিলম্বে তা উপলব্ধি করে।

পুরোপুরি বাদ দেওয়ারcat সম্ভাবনাও রয়েছে । কেন এখানে ডকুমেন্টকে সরাসরি উপলভ্য করবেন না cmd:

cmd << EOF
input
here
EOF

`` `বিড়াল << ইওএফ 1 << ইওফ 2 প্রথমে এখানে-ডক ইওএফ 1 দ্বিতীয় এখানে-ডক ইওফ 2` `above উপরের কাজ করে না।
ব্যবহারকারী 1424739

@ user1424739 এটি বর্তমান zsh এবং ব্যাশে কাজ করে। ছাই এবং ksh93 কেবল এখানে দ্বিতীয় ডকের আউটপুট বলে মনে হচ্ছে।
জেনস

ডাউনটা কেন? যদি কিছু ভুল হয় তবে দয়া করে আমাকে প্রতিকারের সুযোগ দিন।
জেনস

এটি ব্যবহার করার সময় বেশ মিষ্টি sudo tee /etc/securefile.conf <<EOF
ড্রাগন 788

কোন বাশ সংস্করণে এটি কাজ করে? 4.4.19 বাশ (উবুন্টু 18.04.02 তে) এবং ব্যাশ 5.0 (ডকার চিত্র) ব্যবহার করে আমি এখানে দ্বিতীয়টি পেয়েছি। বা সম্ভবত একটি নির্দিষ্ট বিকল্প আছে?
Huelbois

17

হুম, আমি মনে করি হ্যাঁ, পসিএক্স মোডে ব্যাশ পরীক্ষার অনুসারে:

$ bash --posix
$ cat <<EOF |
> ahoj
> nazdar
> EOF
> sed 's/a/b/'
bhoj
nbzdar

অন্য একটি ছোট্ট নোট: বন্ধ হওয়ার পরে কোনও স্পেস রাখবেন না EOF। প্রম্পটটি অদ্ভুত আচরণ করবে এবং আপনি
ভাববেন

2
পসিক্স-মোডে ব্যাশ চালানো কিছু এক্সটেনশন বন্ধ করে দেয় , তবে কোনওভাবেই এগুলি প্রায় সমস্তটিই নয়। যেমন, এই উত্তরটি পসিক্স যা মঞ্জুরি দেয় তার ক্ষেত্রে সঠিক হলেও এর যুক্তি খুব কার্যকরভাবে এটি সমর্থন করে না।
চার্লস ডফি

3

হাই, উদাহরণস্বরূপ এটি পরীক্ষা করুন

#!/bin/sh
( base32 -d | base64 -d )<<ENDOFTEXT
KNDWW42DNNSHS5ZXPJCG4MSVM5MVQVT2JFCTK3DELBFDCY2IIJYGE2JUJNHWS22LINVHQMCMNVFD
CWJQIIZVUV2JOVNEOVJLINTW6PIK
ENDOFTEXT

শুভেচ্ছা

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