জিএনইউ মেকফিলগুলিতে প্রক্রিয়া প্রতিস্থাপন


11

ব্যাশ প্রম্পটে, ছদ্ম ফাইল ব্যবহার করে কেউ আলাদা করতে পারেন:

diff <(echo test) <(echo test)

মেকফিলের মতো এটি যুক্ত করা ব্যর্থ হয়:

all:
        diff <(echo test) <(echo test)

ত্রুটি (ইঙ্গিত: / বিন / শ এই সিস্টেমে / বিন / বাশকে দেখায়):

/bin/sh: -c: line 0: syntax error near unexpected token `('
/bin/sh: -c: line 0: `diff <(echo test) <(echo test)'

এর অর্থ কী, এবং অস্থায়ী ফাইলগুলি না ব্যবহার করে এখনও দুটি আউটপুট আলাদা করার কোনও উপায় আছে?

উত্তর:


20

/bin/shbashআপনার সিস্টেমে থাকতে পারে , তবে যখন আহ্বান করা হবে sh, তখন bashপসিক্স মোডে চলবে (যেমন POSIXLY_CORRECTসংজ্ঞায়িত করা হয়েছিল, বা এটি দিয়ে শুরু হয়েছিল --posix)।

এই মোডে, প্রক্রিয়া বিকল্প বিদ্যমান নেই।

সলিউশন:

all:
    command1 >file1
    command2 >file2
    diff file1 file2
    rm -f file1 file2

বিকল্প:

all:
    bash -c "diff <(command1) <(command2)"

অথবা কেবল মেকফিল ভেরিয়েবলটিকে এই SHELLহিসাবে সংজ্ঞায়িত করুন /bin/bash:

SHELL=/bin/bash

আপনি যদি বহনযোগ্যতা চান তবে প্রথম সমাধানটি নিয়ে যান। আপনি যদি নির্ভরতার সাথে ঠিক থাকেন bashতবে দ্বিতীয়টি বেছে নিন। আপনার অতিরিক্তভাবে যদি অ-জিএনইউ makeবাস্তবায়ন সম্পর্কে যত্ন নেওয়া প্রয়োজন না হয় তবে তৃতীয়টি ব্যবহার করুন।


সেটিং সম্পর্কে SHELL: পসিএক্স স্ট্যান্ডার্ড বলছে যে মেকফাইলগুলিতে এক্সিকিউটেবলকে system()সি লাইব্রেরির ক্রিয়াকলাপের মাধ্যমে ডাকা উচিত make। এই ফাংশনটি SHELLপরিবেশের পরিবর্তনশীল ব্যবহারের গ্যারান্টিযুক্ত নয় (প্রকৃতপক্ষে, এটি করা মান দ্বারা নিরুত্সাহিত করা হয়)। স্ট্যান্ডার্ডটি কিছু দৈর্ঘ্যেও বলে যায় যে মেকফিল ভেরিয়েবলটি সেট করা পরিবেশের পরিবর্তনশীলকেSHELL প্রভাবিত করবে না । তবে আমি জানি যে এর বেশিরভাগ বাস্তবায়নে মেকফিল ভেরিয়েবল কমান্ডগুলি কার্যকর করতে ব্যবহৃত হবে। SHELLmakeSHELL

ইউটিলিটির জন্য রেশনলেmake পরামর্শটি হ'ল bash -c:

Implementতিহাসিক MAKESHELLবৈশিষ্ট্য এবং অন্যান্য makeবাস্তবায়ন দ্বারা সরবরাহিত সম্পর্কিত বৈশিষ্ট্য বাদ দেওয়া হয়েছিল। কিছু প্রয়োগে এটি ব্যবহারকারীর শেলকে ওভাররাইড করতে makeকমান্ডগুলি চালনার জন্য ব্যবহার করতে দেওয়া হয় । এটি বিভ্রান্তিকর ছিল; পোর্টেবলের জন্য make, শেলটি মেকফিল লেখক দ্বারা বেছে নেওয়া উচিত। তদ্ব্যতীত, একজন মেকফিল লেখককে বিকল্প শেল ব্যবহার করার প্রয়োজন নেই এবং এখনও মেকফিল পোর্টেবল বিবেচনা করতে পারেন। বিকল্প শেলটি নির্দিষ্ট করার জন্য কোনও প্রক্রিয়া মানক করা সম্ভব হলেও বিদ্যমান বাস্তবায়নগুলি এই জাতীয় ব্যবস্থার সাথে একমত হয় না এবং মেকফাইল লেখকরা ইতিমধ্যে একটি লক্ষ্যের জন্য নিয়মে শেলের নাম উল্লেখ করে একটি বিকল্প শেলটি আহ্বান করতে পারেন; উদাহরণ স্বরূপ:

python -c "foo"


সেখানে ডাকা একটি উপায় আছে কি bashMakefile নামক বা অস্থায়ী ফাইল ব্যবহার না করেই পরিবর্তন সমস্যা অন্য কোন সমাধান?
জোহানেস

কেবলমাত্র দুটি অস্থায়ী ফাইল ব্যবহার করুন, প্রক্রিয়া প্রতিস্থাপন পদ্ধতি হুডের নীচে যাই হোক না কেন এটি কমবেশি।
কুসালানন্দ

3
এছাড়াও আপনি স্থির করতে পারে SHELLথেকে /bin/bashMakefile মধ্যে।
স্টিফেন কিট

1
@ জোহানেস কুসালানন্দ তার উত্তরে তথ্য যুক্ত করেছেন, এটি দুর্দান্ত যেহেতু এটি প্রচুর বিকল্প এবং সেগুলির পরিস্থিতিতে কীভাবে ব্যবহার করা যায় তা উপস্থাপন করে। আমি বরং আপনি এই উত্তরটি গ্রহণ করবেন ... (তবে আমি অনুভূতির প্রশংসা করি!)
স্টিফেন কিট

2
শেল ভেরিয়েবল ব্যবহার করা তথ্য পসিক্স অনুসারে নয়, এটি খুব সহায়ক ছিল। সম্ভবত এটি ব্যবহার করা আরও ভাল bash -c
জোহানেস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.