এর মতো কোনও "বিধি" নেই। কিছু প্রোগ্রাম এসটিডিআইএন থেকে ইনপুট নেয়, এবং কিছু গ্রহণ করে না। যদি কোনও প্রোগ্রাম 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
কমান্ড।