কেন `সাজানো <(ls -l)` কাজ করে তবে `সাজানো <(ls -l)` ব্যর্থ হয়?


32

আজ আমি এই নিবন্ধটি দিয়ে ফিফো সম্পর্কে কিছু শিখছি: নামযুক্ত পাইপের পরিচিতি , যা উল্লেখ করেছে cat <(ls -l)

আমি ব্যবহার করে কিছু পরীক্ষা-নিরীক্ষা করেছি sort < (ls -l), যা একটি ত্রুটি পপ করে দিয়েছে:

-bash: syntax error near unexpected token `('`

তারপরে আমি দেখতে পেলাম যে কমান্ডে আমি একটি অতিরিক্ত স্থান ভুল করে রেখেছি।

তবে, এই অতিরিক্ত কমান্ড কেন এই ব্যর্থতার দিকে পরিচালিত করবে? পুনঃনির্দেশিত প্রতীকটি কেন কাছাকাছি থাকতে হবে (?


এটি লক্ষ করা উচিত যে * নিক্স শাঁসগুলি হোয়াইটস্পেসের উপর ভিত্তি করে জিনিসগুলি বিভক্ত করে যা টোকেনগুলি তৈরি করে যা আলেকের উল্লেখ করেছে।
ছানাগুলি

উত্তর:


45

কারণ এটি কোনও নয় <, এটি <()সম্পূর্ণ ভিন্ন। একে প্রক্রিয়া প্রতিস্থাপন বলা হয় , এটি নির্দিষ্ট শেলের একটি বৈশিষ্ট্য যা আপনাকে এক প্রক্রিয়ার আউটপুটকে অন্যটির জন্য ইনপুট হিসাবে ব্যবহার করতে দেয়।

>এবং <অপারেটরদের থেকে আউটপুট এবং ইনপুট পুনর্নির্দেশ ফাইল<()অপারেটর কমান্ড (প্রসেস) সঙ্গে পুলিশ, না ফাইল। আপনি যখন দৌড়াবেন

sort < (ls)

আপনি lsসাবসেলের কমান্ডটি চালানোর চেষ্টা করছেন (এটি প্রথম বন্ধনী বলতে বোঝায়), তারপরে সেই সাবশেলটিকে একটি ইনপুট ফাইল হিসাবে পাস করার জন্য sort। এটি অবশ্য সিনট্যাক্স হিসাবে গৃহীত নয় এবং আপনি যে ত্রুটি দেখেছিলেন তা পেয়ে যান।


3
আপনার উত্তরটি ভাল, তবে then sort is attempting to read the subshell as its input file→ এটি স্পষ্টতই ভুল, কারণ বাশ সিন্টেক্সটিও বিশ্লেষণ করবে না। আমরাও lsনা sortআসলে চালানো হয়।
sleblanc

1
@ সিলেব্ল্যাঙ্ক ফর্সা পয়েন্ট, উত্তরটি পুনরায় চাপিয়েছে, ধন্যবাদ।
টেরডন

1
এক্ষেত্রে কোনও উপ-শেল নেই। < (ls)এখানে একটি বৈধ টোকেন নয়।
cuonglm

@ কুওগলম না, কারণ বাশ এটিকে সিনট্যাক্স ত্রুটি হিসাবে গণ্য করে। আমার বক্তব্যটি এটি একটি সাব-শেল (ls)চলবে ls
টেরডন

22

কারণ এটি হ'ল এভাবেই।

<(...)bashপ্রক্রিয়া প্রতিস্থাপনের জন্য বাক্য গঠন রয়েছে in এটি একই অপারেটর থেকে অনুলিপি করা হয়েছে ksh

<, (, ), |, &, ;বিশেষ আভিধানিক টোকেন হয় bashযে বিভিন্ন সমন্বয় বিশেষ অপারেটার গঠন করতে ব্যবহৃত হয়। <, <(, <<, <&... প্রতিটি তাদের ভূমিকা আছে। <পুনঃনির্দেশের জন্য। <file, < fileএকটি ফাইল থেকে ইনপুট পুনর্নির্দেশ হবে। <'(file)'নামক কোনও ফাইল থেকে ইনপুট পুনর্নির্দেশ করবে (file)তবে <(file)এটি একটি ভিন্ন অপারেটর যা কোনও পুনঃনির্দেশ অপারেটর নয়।

< (file)হবে <দ্বারা অনুসরণ (file)। সেই প্রসঙ্গে, ইন bash, (file)বৈধ নয়। (...)কিছু প্রসঙ্গে যেমন একক টোকেন হিসাবে বৈধ হতে পারে:

(sub shell)
func () {
  ...
}
var=(foo bar)

কিন্তু না

sort < (cmd)

ইন fishশেল, এটা আলাদা। ইন fish, (...)কমান্ড প্রতিকল্পন (সমতুল্য জন্য $(...)মধ্যে bash)। এবং <বোর্নের মতো শেলগুলির মতো ইনপুট পুনঃনির্দেশের জন্য।

সুতরাং fish:

sort <(echo file)

যেমন হবে:

sort < (echo file)

এটাই:

sort < file

তবে এটি bashপ্রক্রিয়া বিকল্পের থেকে সম্পূর্ণ আলাদা ।

ইন yashশেল, অন্য POSIX শেল, <(...)জন্য নয় প্রক্রিয়া প্রতিকল্পন কিন্তু প্রক্রিয়া ফেরৎ

সেখানে,

sort <(ls -l)

খুব ছোট:

sort 0<(ls -l)

একটি পুনঃনির্দেশ অপারেটর। এটি কমবেশি সমান:

ls -l | sort

যদিও bash, <(ls -l)একটি নল পথ প্রসারিত হয়, তাই এটি আরো মত:

ls -l | sort /dev/fd/0

ইন zsh, (...)একটি গ্লোব্বিং অপারেটর হিসাবে ওভারলোড হয় ( (*.txt|*.png)প্রসারিত হবে txtএবং pngফাইলগুলি) এবং গ্লোব কোয়ালিফায়ার হিসাবে ( *(/)উদাহরণস্বরূপ ডিরেক্টরি ফাইলগুলিতে প্রসারিত হয়)।

ইন zsh, ইন:

sort < (ls -l)

এটি (ls -l)গ্লোব কোয়ালিফায়ার হিসাবে বিবেচিত হবে। lউল্লিখিত glob সংযোগগুলি সংখ্যার উপর মেলে এবং পরে একটি সংখ্যা আশা কোয়ালিফায়ার l(হিসাবে ls -ld ./*(l2)2 লিঙ্কগুলি সহ ফাইল তালিকা প্রস্তুত হবে), যাতে কেন আপনি একটি পেতে zsh: number expectedত্রুটি।

sort < (w)zsh: no matches found: (w)পরিবর্তে (w)লেখার যোগ্য খালি নামের ফাইলগুলির সাথে মেলে হিসাবে একটি ত্রুটি দিয়েছিল ।

sort < (w|cat)বর্তমান ডিরেক্টরিতে wএবং / অথবা catফাইলগুলির সামগ্রী বাছাই করা হত ...


sort < $(ls -l)এই ত্রুটিটি কেন দেয়:bash: $(ls -l): ambiguous redirect
এডওয়ার্ড টরভাল্ডস

@edwardtorvalds, কারণ $(ls -l)একাধিক শব্দে প্রসারিত। বিভাজন + গ্লোব ( sort < "$(echo file)") রোধ করতে উদ্ধৃতিগুলি ব্যবহার করুন । নোট করুন যে আচরণ বা bashPOSIX sh এর চেয়ে আলাদা যে ব্যাশে সেই বিভাজনটি + গ্লোব করে সেখানে অ-ইন্টারেক্টিভ (যখন না বলা হয় sh)।
স্টাফেন চেজেলাস

দিকে তাকিয়ে ls -l | sort /dev/fd/0আমি যে আউটপুট বলতে পারেন ls -lমধ্যে সংরক্ষিত হয় /dev/fd/0এবং sortকমান্ড তা-ই চেয়েছি আউটপুট দিতে পড়ে। আমি tail -f --retry /dev/fd/0সেই ফাইলটি নিরীক্ষণ করতে ব্যবহার করছি তবে আমি কোনও আউটপুট পাচ্ছি না। কেন? আমি কিভাবে এই ফাইলটি পড়তে পারি?
এডওয়ার্ড টরভাল্ডস

মাছগুলিতে, আপনি (foo | psub)ইনপুট প্রক্রিয়া বিকল্পটি অর্জন করতে ব্যবহার করতে পারেন ; আউটপুট প্রক্রিয়া বিকল্পের বিকল্প নেই (হা)।
জাঞ্চে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.