পুনঃনির্দেশ সম্পর্কে কিছু কৌশল
এটি সম্পর্কে কিছু বাক্য গঠন বিশিষ্টতার গুরুত্বপূর্ণ আচরণ থাকতে পারে। সেখানে প্রায় পুনঃনির্দেশগুলি, কিছু সামান্য নমুনা হয় STDERR
, STDOUT
এবং আর্গুমেন্ট ক্রম ।
1 - ওভাররাইটিং বা সংযোজন?
প্রতীক >
মানে পুনঃনির্দেশ ।
>
মানে একটি সম্পূর্ণ সম্পূর্ণ ফাইল হিসাবে প্রেরণ করুন , যদি উপস্থিত থাকে তবে লক্ষ্যগুলি ওভাররাইটিং ( পরে # 3noclobber
এ ব্যাশ বৈশিষ্ট্যটি দেখুন )।
>>
মানে প্রেরণ ছাড়াও উপস্থিত থাকলে লক্ষ্যতে সংযোজন করা হবে।
যে কোনও ক্ষেত্রে, ফাইলগুলি উপস্থিত না থাকলে সেগুলি তৈরি করা হত।
2 - শেল কমান্ড লাইনটি আদেশ নির্ভর!
এটি পরীক্ষার জন্য, আমাদের একটি সাধারণ কমান্ডের দরকার যা উভয় আউটপুটে কিছু প্রেরণ করবে :
$ ls -ld /tmp /tnt
ls: cannot access /tnt: No such file or directory
drwxrwxrwt 118 root root 196608 Jan 7 11:49 /tmp
$ ls -ld /tmp /tnt >/dev/null
ls: cannot access /tnt: No such file or directory
$ ls -ld /tmp /tnt 2>/dev/null
drwxrwxrwt 118 root root 196608 Jan 7 11:49 /tmp
(আশা করে আপনার নামের কোনও ডিরেক্টরি নেই /tnt
, অবশ্যই;)। ভাল, আমাদের এটা আছে !!
সুতরাং, আসুন দেখুন:
$ ls -ld /tmp /tnt >/dev/null
ls: cannot access /tnt: No such file or directory
$ ls -ld /tmp /tnt >/dev/null 2>&1
$ ls -ld /tmp /tnt 2>&1 >/dev/null
ls: cannot access /tnt: No such file or directory
শেষ কমান্ড লাইনটি STDERR
কনসোলে যায় এবং এটি প্রত্যাশিত আচরণ বলে মনে হয় না ... তবে ...
আপনি যদি একটি আউটপুট, অন্য বা উভয় সম্পর্কে কিছু পোস্ট ফিল্টার করতে চান :
$ ls -ld /tmp /tnt | sed 's/^.*$/<-- & --->/'
ls: cannot access /tnt: No such file or directory
<-- drwxrwxrwt 118 root root 196608 Jan 7 12:02 /tmp --->
$ ls -ld /tmp /tnt 2>&1 | sed 's/^.*$/<-- & --->/'
<-- ls: cannot access /tnt: No such file or directory --->
<-- drwxrwxrwt 118 root root 196608 Jan 7 12:02 /tmp --->
$ ls -ld /tmp /tnt >/dev/null | sed 's/^.*$/<-- & --->/'
ls: cannot access /tnt: No such file or directory
$ ls -ld /tmp /tnt >/dev/null 2>&1 | sed 's/^.*$/<-- & --->/'
$ ls -ld /tmp /tnt 2>&1 >/dev/null | sed 's/^.*$/<-- & --->/'
<-- ls: cannot access /tnt: No such file or directory --->
লক্ষ্য করুন যে এই অনুচ্ছেদে শেষ কমান্ড লাইনটি পূর্ববর্তী অনুচ্ছেদের মতোই একই, যেখানে আমি লিখেছি প্রত্যাশিত আচরণ বলে মনে হচ্ছে না (সুতরাং এটি এমনকি একটি প্রত্যাশিত আচরণও হতে পারে)।
ঠিক আছে, উভয় আউটপুটগুলিতে আলাদা অপারেশন করার জন্য পুনঃনির্দেশগুলি সম্পর্কে কিছু কৌশল রয়েছে
:
$ ( ls -ld /tmp /tnt | sed 's/^/O: /' >&9 ) 9>&2 2>&1 | sed 's/^/E: /'
O: drwxrwxrwt 118 root root 196608 Jan 7 12:13 /tmp
E: ls: cannot access /tnt: No such file or directory
নোটা: &9
বর্ণনাকারীর কারণে স্বতঃস্ফূর্তভাবে ঘটবে ) 9>&2
।
সংযোজন: নোটা! এর নতুন সংস্করণ সহসজোরে আঘাত( >4.0
) এই জাতীয় জিনিসগুলি করার জন্য একটি নতুন বৈশিষ্ট্য এবং আরও সেক্সি সিনট্যাক্স রয়েছে:
$ ls -ld /tmp /tnt 2> >(sed 's/^/E: /') > >(sed 's/^/O: /')
O: drwxrwxrwt 17 root root 28672 Nov 5 23:00 /tmp
E: ls: cannot access /tnt: No such file or directory
এবং অবশেষে এই জাতীয় ক্যাসকেডিং আউটপুট বিন্যাসের জন্য:
$ ((ls -ld /tmp /tnt |sed 's/^/O: /' >&9 ) 2>&1 |sed 's/^/E: /') 9>&1| cat -n
1 O: drwxrwxrwt 118 root root 196608 Jan 7 12:29 /tmp
2 E: ls: cannot access /tnt: No such file or directory
সংযোজন: নোটা! উভয় উপায়ে একই নতুন বাক্য গঠন:
$ cat -n <(ls -ld /tmp /tnt 2> >(sed 's/^/E: /') > >(sed 's/^/O: /'))
1 O: drwxrwxrwt 17 root root 28672 Nov 5 23:00 /tmp
2 E: ls: cannot access /tnt: No such file or directory
যেখানে STDOUT
একটি নির্দিষ্ট ফিল্টার দিয়ে যান, STDERR
অন্যটিতে এবং অবশেষে উভয় আউটপুটগুলি মার্জ হয়ে যায় তৃতীয় কমান্ড ফিল্টারটি।
3 - noclobber
বিকল্প এবং >|
বাক্য গঠন সম্পর্কে একটি শব্দ
ওভাররাইটিং সম্পর্কে এটি :
কোনও বিদ্যমান ফাইল ওভাররাইট নাset -o noclobber
করার জন্য বাশকে নির্দেশ দেওয়ার সময় সিনট্যাক্স আপনাকে এই সীমাবদ্ধতাটি অতিক্রম করতে দেয়:>|
$ testfile=$(mktemp /tmp/testNoClobberDate-XXXXXX)
$ date > $testfile ; cat $testfile
Mon Jan 7 13:18:15 CET 2013
$ date > $testfile ; cat $testfile
Mon Jan 7 13:18:19 CET 2013
$ date > $testfile ; cat $testfile
Mon Jan 7 13:18:21 CET 2013
ফাইলটি প্রতিবার ওভাররাইট করা হয়েছে, এখন ভাল:
$ set -o noclobber
$ date > $testfile ; cat $testfile
bash: /tmp/testNoClobberDate-WW1xi9: cannot overwrite existing file
Mon Jan 7 13:18:21 CET 2013
$ date > $testfile ; cat $testfile
bash: /tmp/testNoClobberDate-WW1xi9: cannot overwrite existing file
Mon Jan 7 13:18:21 CET 2013
এর মাধ্যমে পাস করুন >|
:
$ date >| $testfile ; cat $testfile
Mon Jan 7 13:18:58 CET 2013
$ date >| $testfile ; cat $testfile
Mon Jan 7 13:19:01 CET 2013
এই বিকল্পটি আনসেট করা এবং / অথবা ইতিমধ্যে সেট করা থাকলে অনুসন্ধান করা।
$ set -o | grep noclobber
noclobber on
$ set +o noclobber
$ set -o | grep noclobber
noclobber off
$ date > $testfile ; cat $testfile
Mon Jan 7 13:24:27 CET 2013
$ rm $testfile
4 - শেষ কৌশল এবং আরও ...
প্রদত্ত কমান্ড থেকে উভয় আউটপুট পুনঃনির্দেশের জন্য , আমরা দেখতে পাচ্ছি যে একটি সঠিক বাক্য গঠন হতে পারে:
$ ls -ld /tmp /tnt >/dev/null 2>&1
এই বিশেষ ক্ষেত্রে, একটি শর্টকাট বাক্য গঠন আছে: &>
... বা>&
$ ls -ld /tmp /tnt &>/dev/null
$ ls -ld /tmp /tnt >&/dev/null
নোটা: যদি 2>&1
উপস্থিত থাকে তবে 1>&2
এটিও একটি সঠিক বাক্য গঠন:
$ ls -ld /tmp /tnt 2>/dev/null 1>&2
4 বি- এখন, আমি আপনাকে এই সম্পর্কে ভাবতে দেব:
$ ls -ld /tmp /tnt 2>&1 1>&2 | sed -e s/^/++/
++/bin/ls: cannot access /tnt: No such file or directory
++drwxrwxrwt 193 root root 196608 Feb 9 11:08 /tmp/
$ ls -ld /tmp /tnt 1>&2 2>&1 | sed -e s/^/++/
/bin/ls: cannot access /tnt: No such file or directory
drwxrwxrwt 193 root root 196608 Feb 9 11:08 /tmp/
4 সি- আপনি যদি আরও তথ্যে আগ্রহী হন
আপনি আঘাত করে সূক্ষ্ম ম্যানুয়ালটি পড়তে পারেন:
man -Len -Pless\ +/^REDIRECTION bash
এ এ সজোরে আঘাত কনসোল ;-)