40_ কাস্টম ফাইলটিতে "এক্সেল টেইল-এন +3 $ 0" লাইনটির অর্থ


17

আমি গ্রাব কনফিগারেশন ফাইলগুলি বোঝার চেষ্টা করছি। সুতরাং, এই প্রক্রিয়া চলাকালীন আমি ফাইল /etc/grub.d/40_custom নিয়ে এসেছি । আমার ফাইলটিতে নিম্নলিখিত লাইন রয়েছে:

#!/bin/sh
exec tail -n +3 $0
# This file provides an easy way to add custom menu entries.  Simply type the
# menu entries you want to add after this comment.  Be careful not to change
# the 'exec tail' line above.
menuentry "Windows 10" --class windows --class os {
insmod part_msdos
savedefault
insmod ntfs
insmod ntldr
set root='(hd0,msdos1)'
ntldr ($root)/bootmgr
}

যেহেতু আমার সিস্টেমটি দ্বৈত বুট এবং স্পষ্টতই এটি উইন্ডোজ 10 এর বুট লোডার।

আমার প্রশ্ন যদিও এই অংশ exec tail -n +3 $0
যদি আমি এটি সঠিকভাবে ডিক্রিফার করছি তবে এর অর্থ হ'ল +3ফাইলের তৃতীয় লাইন ( ) থেকে শুরু হওয়া শেষ লাইনগুলি মুদ্রণ করা $0$0অবশ্যই এই ক্ষেত্রে আসল ফাইল /etc/grub.d/40_custom

সুতরাং, আমরা কেন এই আদেশটি 40_ কাস্টম ফাইলটিতে ব্যবহার করব ? আমি যেমন এটি পেয়েছি আউটপুট একই হবে যদি এটি পুরোপুরি বাদ দেওয়া হয়। আমি কেবল ভিন্ন ভিন্ন হিসাবে ভাবতে পারি প্রথম লাইন যা দোভাষীকে সনাক্ত করে:

#!/bin/sh

তবে তারপরে আবার এটি কার্যকর করা exec tail -n +3 $0হয়। সুতরাং, এটি কি কেবল একটি (অকেজো) কনভেনশন?

উত্তর:


16

কৌশলটি যা execকরে:

$ help exec
exec: exec [-cl] [-a name] [command [arguments ...]] [redirection ...]
    Replace the shell with the given command.

    Execute COMMAND, replacing this shell with the specified program.
    ARGUMENTS become the arguments to COMMAND.  If COMMAND is not specified,
    any redirections take effect in the current shell.

এর অর্থ এটি execএই ক্ষেত্রে যা দেওয়া হয় তার সাথে শেলটি প্রতিস্থাপন করবে tail। কর্মের ক্ষেত্রে এটির উদাহরণ এখানে:

$ cat ~/foo.sh
#!/bin/sh
exec tail -n +3 "$0"
echo foo

$ ./foo.sh
echo foo

সুতরাং echoকমান্ডটি কার্যকর হয়নি কারণ আমরা শেল পরিবর্তন করেছি এবং এর tailপরিবর্তে ব্যবহার করছি । আমরা যদি সরিয়ে ফেলি exec tail:

$ cat ~/foo.sh
#!/bin/sh
echo foo
$ ./foo.sh
foo

সুতরাং, এটি একটি ঝরঝরে কৌশল যা আপনাকে এমন স্ক্রিপ্ট লিখতে দেয় যার একমাত্র কাজ তার নিজস্ব বিষয়বস্তু আউটপুট করা। সম্ভবত, কল যাই হোক না কেন 40_customতার সামগ্রীর আউটপুট হিসাবে প্রত্যাশা করে। অবশ্যই, কেন এটি tail -n +3 /etc/grub.d/40_customসরাসরি সরাসরি চালাচ্ছে না এই প্রশ্নটি উত্থাপন করে।

আমি উত্তরটি অনুমান করছি যেহেতু grub এটির নিজস্ব স্ক্রিপ্টিং ভাষা ব্যবহার করে এবং এর ফলে এটির প্রয়োজন হয় না।


চমৎকার উত্তর! তবে আমরা যদি #!/bin/tail -n +2শেলব্যাং হিসাবে লিখব? এটি কি ফাইলের বাকী মুদ্রণ করবে?
বলেছেন মনিকা পুনরায়

@ ওভাল চেষ্টা করে দেখুন দেখুন :) দেখা যাচ্ছে এটি শেবাং হিসাবে পুরোপুরি কাজ করে না, -n +2মনে হয় এটি ব্যাখ্যা করা হয়েছে -n 2এবং কেবল শেষ দুটি লাইন মুদ্রিত হয়েছে। যদিও এটি সম্ভবত নিজস্ব প্রশ্ন মূল্যবান।
টেরডন

3
@ ওভাল ... শেবাং আচরণ আপনার প্রত্যাশার তুলনায় অনেক কম মানক এবং বহনযোগ্য। এন.ইউইকিপিডিয়া.আর
চার্লস ডাফি

@ ওভাল যা লিনাক্সে কাজ করে যদি আপনি nএবং এর মধ্যে স্থানটি সরিয়ে দেন +। লিনাক্সে কমপক্ষে এক্সিকিউটেবল পাথ এবং স্পেসের পরে নিম্নলিখিত অক্ষরগুলিকে একক যুক্তি হিসাবে বিবেচনা করা হয়। সুতরাং স্থানটির সাথে, লেজটি এটি দেখে এবং সম্ভবত অবৈধ উপসর্গের -nযুক্তি যা আছে তা সরিয়ে ফেলার সিদ্ধান্ত নেয় (এই ক্ষেত্রে, একটি স্থান এবং একটি+ সংখ্যায় না আসা পর্যন্ত ) । যাইহোক, চার্লস ডাফি যেমন বলেছিলেন, তারা যেভাবে চালিয়েছে তা সম্ভবত অন্যান্য ইউনিটগুলির কাছে আরও বহনযোগ্য।
জোল

1
@ ফ্লুফি তারা এখানে ডক ব্যবহার করতে পারে। আমার উত্তরে ফেডোরা ডকুমেন্টেশনের লিঙ্কটি দেখুন। তারা ঠিক cat <<EOF ...EOFসেখানে ব্যবহার
সের্গি কলডিয়্যাজনি

9

ডিরেক্টরিটিতে /etc/grub.d/অনেক এক্সিকিউটেবল থাকে (সাধারণত শেল স্ক্রিপ্টস, তবে অন্য কোনও এক্সিকিউটেবল টাইপও সম্ভব)। যখনই grub-mkconfigমৃত্যুদন্ড কার্যকর হয় (যেমন আপনি চালনা করেন তবে আপনি update-grubযখন আপডেট হওয়া কার্নেল প্যাকেজ ইনস্টল করেন তখন সাধারণত একটি ইনস্টল-পরবর্তী হুক থাকে যা প্যাকেজ ম্যানেজারকে আপডেট করতে বলে grub.cfg), এগুলি সমস্ত বর্ণানুক্রমিকভাবে কার্যকর করা হয়। তাদের আউটপুটগুলি সমস্ত কনটেনটেটেড হয়ে যায় এবং /boot/grub/grub.cfgঝরঝরে করে ফাইলের মধ্যে শেষ হয়, ঝরঝরে বিভাগের শিরোনামগুলি দেখায় যে কোন /etc/grub.d/ফাইলটি কোন ফাইল থেকে আসে ।

এই একটি বিশেষ ফাইল 40_customডিজাইন করা হয়েছে যাতে আপনি সহজেই grub.cfgএই ফাইলটিতে এগুলি টাইপ / আটকানোর মাধ্যমে সহজেই এন্ট্রি / লাইনগুলিকে যুক্ত করতে পারবেন । একই ডিরেক্টরিতে থাকা অন্যান্য স্ক্রিপ্টগুলি আরও জটিল কাজগুলি করে যেমন কার্নেল বা নন-লিনাক্স অপারেটিং সিস্টেমগুলি অনুসন্ধান করা এবং তাদের জন্য মেনু এন্ট্রি তৈরি করা।

এই grub-mkconfigসমস্ত ফাইলকে একইভাবে চিকিত্সার অনুমতি দেওয়ার জন্য (নির্বাহ করুন এবং আউটপুট গ্রহণ করুন), 40_customএটি একটি স্ক্রিপ্ট এবং exec tail -n +3 $0এর সামগ্রীগুলি আউটপুট করতে এই পদ্ধতিটি ব্যবহার করে ("শিরোনামকে বিয়োগ করে")। যদি এটি কার্যকরযোগ্য না update-grubহয় তবে এই ফাইলটির আক্ষরিক পাঠ্য সামগ্রীটি অন্য সকলের মতো চালানোর পরিবর্তে গ্রহণের জন্য একটি বিশেষ হার্ড-কোডেড ব্যতিক্রম প্রয়োজন would তবে আপনি যদি (বা অন্য একটি লিনাক্স বিতরণের প্রস্তুতকারক) এই ফাইলটির আলাদা নাম দিতে চান তবে কী হবে? বা আপনি যদি ব্যতিক্রম সম্পর্কে না জানতেন এবং একটি শেল স্ক্রিপ্ট নামের নামটি তৈরি করেন তবে 40_custom?

আপনি সম্বন্ধে আরও পড়তে পারেন grub-mkconfigএবং /etc/grub.d/*গনুহ গ্রাব ম্যানুয়াল (এটা বিকল্প সেট করতে পারেন সম্পর্কে বেশিরভাগ আলোচনা যদিও /etc/default/grub), এবং সেখানে একটি ফাইল হওয়া উচিত /etc/grub.d/READMEযে রাজ্যের এই ফাইলগুলি মৃত্যুদন্ড কার্যকর গঠনের grub.cfg


1
যদিও টেরডনের উত্তরটি লাইনটি কীভাবে কাজ করে তা ব্যাখ্যা করে, GRUB কেন এইভাবে কাজ করে সে সম্পর্কে এটি আরও একটি প্রশংসনীয় নকশার কারণ দেয়।
জোল

দুর্দান্ত উত্তর। বিশেষ ব্যতিক্রম সম্পর্কে আপনার বক্তব্য - একটি "সরল" ব্যতিক্রম দুটি ডিরেক্টরি থাকতে পারে যেমন /etc/grub.d/execএক্সটেকটেবল ফাইল / স্ক্রিপ্টগুলির /etc/grub.d/staticজন্য এবং সরল পাঠ্য ফাইলগুলির জন্য, বা অন্য কোনও সূচককে এগুলি আলাদা করতে। যাইহোক, এটি তাদের নকশার সিদ্ধান্ত ছিল।
স্টোবর

3

টিএল; ডিআর : ফাইলটিতে নতুন এন্ট্রি যুক্ত করা সহজ করার কৌশল

পুরো পয়েন্টটি উবুন্টুর উইকির একটি পৃষ্ঠায় গ্রুবে বর্ণিত হয়েছে :

  1. আপডেট-গ্রাব প্রয়োগের সময় কেবল এক্সিকিউটেবল ফাইলগুলি grub.cfg এ আউটপুট উত্পন্ন করে।

স্ক্রিপ্ট আউটপুট ইন /etc/grub.d/grub.cfg ফাইলের সামগ্রীতে পরিণত হয় ।

এখন, কি করে exec? এটি হয় পুরো স্ক্রিপ্টের জন্য পুনরায় তারের আউটপুট বা কোনও কমান্ড সরবরাহ করা হলে - উল্লিখিত কমান্ডটি স্ক্রিপ্ট প্রক্রিয়াটিকে ছাড়িয়ে যাবে এবং প্রতিস্থাপন করবে। পিআইডি 1234 এর সাথে শেল স্ক্রিপ্ট যা ছিল তা এখন tailপিআইডি 1234 এর সাথে কমান্ড।

এখন আপনি ইতিমধ্যে জেনে tail -n +3 $0গেছেন যে স্ক্রিপ্টে নিজেই তৃতীয় লাইনের পরে সবকিছু মুদ্রণ করে। তাহলে কেন আমাদের এটি করা দরকার? গ্রাব যদি কেবলমাত্র আউটপুট সম্পর্কে চিন্তা করে তবে আমরা ঠিক তেমন করতে পারি

cat <<EOF
    menuentry {
    ...
    }
EOF

প্রকৃতপক্ষে, আপনি ফেডোরা ডকুমেন্টেশনেcat <<EOF উদাহরণ পাবেন , ভিন্ন উদ্দেশ্যে হলেও। পুরো বিষয়টি মন্তব্যগুলিতে রয়েছে - ব্যবহারকারীদের জন্য ব্যবহারের সহজতা:

# This file provides an easy way to add custom menu entries.  Simply type the
# menu entries you want to add after this comment.

সঙ্গে execকৌতুক, আপনাকে জানতে হবে কী হবে না cat <<EOF(ভক্ষক করি, য়েন বলা হচ্ছে এখানে-ডক ), বা আপনি যোগ করতে মনে রাখতে হয় EOFগত লাইনে। কেবল ফাইলটিতে মেনুয়েণ্ট্রি যুক্ত করুন এবং এটি দিয়ে সম্পন্ন করুন। এছাড়াও, আপনি যদি মেনুয়েণ্ট্রি যুক্ত করে স্ক্রিপ্ট করছেন তবে আপনি সহজেই >>এই ফাইলটিতে শেল যুক্ত করতে পারেন ।

আরো দেখুন:


কিন্তু গ্রাব সরাসরি ফাইল পড়েনি কেন? তারা কেন তাদের পরিবর্তে এগুলি কার্যকর করার যোগ্য করে তোলে বলে আপনার কোনও ধারণা আছে? এগুলিকে সহজ পাঠ্য ফাইল হিসাবে আনা অনেক সহজ হবে যা মেনুটি তৈরি করে যা কিছু প্রক্রিয়া দ্বারা পঠিত হয়, তবে পরিবর্তে তারা এগুলিকে এক্সিকিউটেবল করার জন্য বেছে নিয়েছিল এবং এটি (ঝরঝরে) তবে জটিল কর্মপরিকল্পনা যুক্ত করেছে। আমার উত্তরটিতে পোস্ট করার কারণে গ্রাবের নিজস্ব স্ক্রিপ্টিং ভাষা আছে বলেই কি?
টেরডন

@ এটারডন আমি মনে করি না এটি নিজেই গ্রাব ভাষার সাথে কিছু করতে হবে। সেক্ষেত্রে আপনার দরকার পড়বে না #!/bin/sh। আমি সন্দেহ করি এটি কেবল historical তিহাসিক কারণ ( পিইপিএএ কোডবেস থেকে নেওয়া) এবং এসআইএসভি ধরণের স্ক্রিপ্টিং দ্বারা অনুপ্রাণিত একটি ডিজাইনের সিদ্ধান্ত।
সের্গেই কোলোডিয়াজনি

এই @terdon আসলে একটি প্রশ্ন অনুপ্রাণিত unix.stackexchange.com/q/492966/85039
Sergiy Kolodyazhnyy
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.