কেন বেস প্রক্রিয়া প্রতিস্থাপন কিছু আদেশের সাথে কাজ করে না?


29

উপলক্ষে প্রক্রিয়া প্রতিস্থাপন প্রত্যাশার মতো কাজ করবে না। এখানে একটি উদাহরণ:

ইনপুট:

gcc <(echo 'int main(){return 0;}')

আউটপুট:

/dev/fd/63: file not recognized: Illegal seek
collect2: error: ld returned 1 exit status

ইনপুট:

তবে এটি ভিন্ন কমান্ডের সাহায্যে প্রত্যাশার মতো কাজ করে:

grep main <(echo 'int main(){return 0;}')

আউটপুট:

int main(){return 0;}

আমি অন্যান্য কমান্ডের সাথে অনুরূপ ব্যর্থতা লক্ষ্য করেছি (যেমন প্রক্রিয়া প্রতিস্থাপনের ফাইলটি প্রত্যাশা করা কমান্ড ব্যবহার করতে /dev/fd/63বা অনুরূপ করতে পারে না )। এই ব্যর্থতাটি gccকেবল সাম্প্রতিকতম। প্রক্রিয়া প্রতিস্থাপন এইভাবে ব্যর্থ হবে এবং ব্যবহার করা উচিত হবে না তা নির্ধারণ করার জন্য আমার কিছু সচেতন নিয়ম আছে?

আমি উবুন্টু 12.04 এ এই বেস সংস্করণটি ব্যবহার করছি (আমি এটি খিলান এবং
ডিবিয়ানেও দেখেছি): জিএনইউ ব্যাশ, সংস্করণ 4.3.11 (1) -রেলিজ (i686-pc-linux-gnu)


1
illegal seekউত্তর মত দেখাচ্ছে - |pipeযে bashকরতে মৃত্যুদন্ড কার্যকর প্রোগ্রাম পয়েন্ট একটি seekable ফাইল নয়। সম্ভবত আপনি যদি echo data | command /dev/fd/0কোনও প্রোগ্রামে সফলভাবে না পারতে পারেন তবে আপনার ভাগ্যের ডাব্লু / হবে <(cmd)। এটি কোনও ডিস্ক ফাইল সরবরাহ করে না - এটি কেবলমাত্র একটি যুক্তি প্রতিস্থাপন করে যা পাইপ ফাইলের বর্ণনাকারীকে নির্দেশ করে।
মাইক্রজারভ

2
এই বিশেষ ক্ষেত্রে, যদিও জিসিসি স্ট্যান্ডার্ড ইনপুট গ্রহণ করতে পারে , এটি ভাষাটি নির্ধারণ করতে ফাইলের নাম এক্সটেনশনটি ব্যবহার করে (ডিফল্টরূপে)। সুতরাং চেষ্টা করুন gcc -xc <(echo 'int main(){return 0;}')(যা Cস্পষ্টভাবে ভাষা সেট করে )।
স্টিল্ড্রাইভার

আমার নিজের প্রশ্নের উত্তরে আমাকে এখানে পরিচালিত করা হয়েছিল, যা সম্ভবত এটির আর একটি উদাহরণ হতে পারে বলে মনে হয়। superuser.com/questions/1243405 । আমি যতটা সক্ষম হয়েছি তার চেয়ে প্রশ্নের উত্তর দেওয়ার জন্য ধন্যবাদ।
জোনাথন হার্টলি

উত্তর:


33

প্রক্রিয়া প্রতিস্থাপনের ফলে একটি বিশেষ ফাইলে ফলাফল আসে (যেমন /dev/fd/63আপনার উদাহরণের মতো) যা নামযুক্ত পাইপের পড়ার শেষের মতো আচরণ করে। এই ফাইলটি খোলা এবং পড়তে পারে, তবে লিখিত নয়, সন্ধান করা হয়নি।

খাঁটি স্রোত হিসাবে তাদের যুক্তিগুলি বিবেচনা করে এমন কমান্ডগুলি কাজ করে যখন তাদের দেওয়া ফাইলগুলি অনুসন্ধান করার প্রত্যাশী কমান্ডগুলি (বা তাদের কাছে লিখিতভাবে) কাজ করবে না। কমান্ড ধরনের ইচ্ছা কাজ কি সাধারণত একটি ফিল্টার বিবেচনা করা হয় যে: cat, grep, sed, gzip, awk, ইত্যাদি ... একটি কমান্ড হবে এমন কাজ না মতো এডিটর একটি উদাহরণ viবা মত একটি ফাইল অপারেশন mv

gccতারা কোন ভাষায় লেখা আছে তা সনাক্ত করতে তার ইনপুট ফাইলগুলিতে এলোমেলো অ্যাক্সেস করতে সক্ষম হতে চায় you আপনি যদি পরিবর্তে gccইনপুট ফাইলের ভাষা সম্পর্কে কোনও ইঙ্গিত দেন তবে ফাইলটি প্রবাহিত করে খুশি:

gcc -x c <(echo 'int main(){return 0;}')

প্রক্রিয়া প্রতিস্থাপন ছাড়া সহজ আরও সোজা ফর্ম এছাড়াও কাজ করে:

echo 'int main(){return 0;}' | gcc -x c -

মনে রাখবেন যে এটি নির্দিষ্ট নয় bash। প্রক্রিয়া প্রতিস্থাপন সমর্থন করে এমন সমস্ত শেল একই পদ্ধতিতে আচরণ করে।


জিসিসি কাজের জন্য +1 তবে আমি ফাইল সম্পর্কে আপনার পয়েন্ট সম্পর্কে নিশ্চিত নই। <()বিন্যাস সব ইন্টেন্টগুলি এবং উদ্দেশ্যের জন্য একটি ফাইল মত আচরণ করা উচিত নয়। আসলে, আমি এমন কোনও কমান্ড জানি না যা এমন ফাইল প্রত্যাশা করে যা খুশি হবে না <()। যেগুলি কাজ করে না সেগুলি হ'ল ফাইল নয়, যারা ফাইলের নাম প্রত্যাশা করে। উদাহরণস্বরূপ, grep -fএকটি ফাইল প্রত্যাশা করে এবং এটি দিয়ে সূক্ষ্মভাবে কাজ করে <()
টেরডন

4
@terndon নিশ্চিতভাবে <()একটি ফাইলের নাম উত্পাদন করে (কনস্ট্রাক্টটি প্রসারিত হয়/proc/self/fd/something আমার সিস্টেমে )। এই নামটি খোলার পরে, এতে S_IFIFOনিয়মিত ফাইল ( S_IFREG) পরিবর্তে নামযুক্ত পাইপ ( ) পড়ার শেষের মতো কাজ করে যা এতে সমর্থনযোগ্য read()এবং অন্যদের নয় seek()
সেলেডা

7
নোটটি যে zshপ্রক্রিয়া প্রতিস্থাপনের তৃতীয় রূপকে সমর্থন করে যা অস্থায়ী ফাইলগুলি বিশেষত সেই উদ্দেশ্যে ব্যবহার করে:gcc =(echo 'int main(){return 0;}')
স্টাফেন চেজেলাস

সম্পর্কিত হতে পারে কাজ করে <(echo '...')তবে সাথে নয় <(git show ...)। কোন ধারণা কেন হতে পারে?
জার্ন হিজ

2
জিসিসি "তারা কোন ভাষায় লেখা আছে তা সনাক্ত করতে তার ইনপুট ফাইলগুলিতে এলোমেলো অ্যাক্সেস সম্পাদন করে না"। এটি কেবল ফাইলের এক্সটেনশনের দিকে নজর দেয়। যদি ফাইলনামটির কোনও এক্সটেনশন না থাকে (বা যদি এটির একটি স্বীকৃতি পায় না), জিসিসি ধরে নেয় ফাইলটি একটি অবজেক্ট ফাইল বা লিঙ্কার স্ক্রিপ্ট এবং এটি পাস করে ld(যা অবজেক্ট ফর্ম্যাটগুলি সনাক্ত করে)। -xইঙ্গিত নয়; এটি একটি ঘোষণা। আপনি যদি নির্দিষ্ট করে থাকেন তবে -x f95জিসিসি ফাইলটির নাম বা বিষয়বস্তু নির্বিশেষে ফোর্টরান -৯৫ সংকলকটিতে ফাইলটি পাঠিয়ে দেবে। Gcc.gnu.org/onlinesocs/gcc-8.1.0/gcc/ সামগ্রিক-Options.html
rici
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.