এর মতো কোনও "বিধি" নেই। কিছু প্রোগ্রাম এসটিডিআইএন থেকে ইনপুট নেয়, এবং কিছু গ্রহণ করে না। যদি কোনও প্রোগ্রাম STDIN থেকে ইনপুট নিতে পারে তবে এটিতে পাইপ দেওয়া যেতে পারে, যদি না হয় তবে তা পারে না।
কোনও প্রোগ্রাম কোনও কাজটি কী করে তা চিন্তা করেই ইনপুট নেবে কিনা তা আপনি সাধারণত বলতে পারেন। যদি প্রোগ্রামটির কাজটি কোনওভাবে কোনও ফাইলের বিষয়বস্তুগুলি হস্তান্তর করা হয় (যেমন, উদাহরণস্বরূপ)grep , sed, awkইত্যাদি), এটা সাধারণত stdin থেকে ইনপুট নেয়। তার কাজ ফাইল নিজেই (যেমন নিপূণভাবে হয় তাহলে mv, rm, cp) বা একটি প্রক্রিয়া (যেমন kill, lsof) অথবা কিছু সম্পর্কে রিটার্ন তথ্যে (যেমন top, find, ps) তারপর, এটা না।
এটি নিয়ে চিন্তা করার আর একটি উপায় হ'ল আর্গুমেন্ট এবং ইনপুটগুলির মধ্যে পার্থক্য। উদাহরণ স্বরূপ:
mv foo bar
উপরের কমান্ডটিতে এর mvমতো কোনও ইনপুট নেই। এটি যা দেওয়া হয়েছে তা দুটি যুক্তি। এটি ফাইলগুলির মধ্যে যা রয়েছে তা জানে না বা যত্ন করে না, এটি কেবল এটির আর্গুমেন্টগুলি জানে এবং এটি তাদের পরিচালনা করতে হবে।
অন্য দিকে
sed -e 's/foo/bar/' < file
--- -- ------------ ----
| | | |-> input
| | |------------> argument
| |--------------------> option/flag/switch
|------------------------> command
এখানে, sedযুক্তির পাশাপাশি ইনপুট দেওয়া হয়েছে। যেহেতু এটি ইনপুট নেয়, এটি এটি STDIN থেকে পড়তে পারে এবং এটিতে পাইপ করা যায়।
এটি আরও জটিল হয় যখন কোনও যুক্তি ইনপুট হতে পারে । উদাহরণ স্বরূপ
cat file
এখানে, fileদেওয়া হয়েছিল যে যুক্তি cat। সুনির্দিষ্টভাবে বলতে গেলে, ফাইলের নামটি file আর্গুমেন্ট। তবে, যেহেতু catএকটি প্রোগ্রাম যা ফাইলগুলির বিষয়বস্তুগুলি পরিচালনা করে, তাই এর ইনপুটটি যা কিছু ভিতরে থাকে file।
এটি straceএমন একটি প্রোগ্রাম ব্যবহার করে চিত্রিত করা যেতে পারে যা একটি প্রোগ্রাম যা প্রক্রিয়াগুলি দ্বারা সিস্টেম কলগুলি ট্র্যাক করে। যদি আমরা এর cat fooমাধ্যমে চালাই তবে আমরা straceদেখতে পাচ্ছি যে ফাইলটি fooখোলা আছে:
$ strace cat foo 2| grep foo
execve("/bin/cat", ["cat", "foo"], [/* 44 vars */]) = 0
open("foo", O_RDONLY)
উপরের প্রথম সারিতে দেখায় যে প্রোগ্রামটি /bin/catআহ্বান করা হয়েছিল এবং এর তর্কগুলি ছিলcat এবং foo(প্রথম যুক্তিটি সর্বদা প্রোগ্রাম নিজেই হয়)। পরে, যুক্তিটি fooকেবল পঠন মোডে খোলা হয়েছিল। এখন, এর সাথে তুলনা করুন
$ strace ls foo 2| grep foo
execve("/bin/ls", ["ls", "foo"], [/* 44 vars */]) = 0
stat("foo", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
lstat("foo", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
write(1, "foo\n", 4foo
এখানেও, lsনিজেকে এবং fooতর্ক হিসাবে গ্রহণ । তবে, কোনও openকল নেই, যুক্তিটিকে ইনপুট হিসাবে বিবেচনা করা হবে না। পরিবর্তে,ls ফাইলটির তথ্য পেতে সিস্টেমের statলাইব্রেরি (যা statকমান্ডের মতো একই জিনিস নয় ) কল করে foo।
সংক্ষেপে, আপনি যে কমান্ডটি চালাচ্ছেন সেটি যদি তার ইনপুটটি পড়তে পারে তবে আপনি এটিতে পাইপ করতে পারেন, যদি তা না হয় তবে আপনি পারবেন না।
pgrep,pkillএবংkillallকমান্ড।