كيفية استخدام "مستندات هنا" في Bash على Linux
نشرت: 2022-01-29تتيح لك "المستندات هنا" المسماة بشكل غريب استخدام إعادة توجيه الإدخال / الإخراج داخل نصوص Bash على نظام Linux. إنها طريقة رائعة لأتمتة الأوامر التي تحتاجها للتشغيل على كمبيوتر بعيد.
هنا المستندات
العديد من الأوامر في Linux لها اسمان أو ثلاثة أحرف. هذا ما أدى جزئيًا إلى ظهور فكرة أن Linux يصعب تعلمه ومليء بالأوامر الغامضة. لكن أحد أغرب الأسماء في Linux ليس من الأسماء المختصرة المشفرة. "المستندات هنا" ليست مستندات ، وليس من الواضح حقًا ما تشير إليه كلمة "هنا" أيضًا.
إنها بنية غامضة نسبيًا ، لكنها مفيدة. بالطبع ، هذا نظام Linux ، لذلك هناك أكثر من طريقة لجلد قطة. يمكن إعادة إنتاج بعض الوظائف التي توفرها المستندات هنا بطرق أخرى. عادة ما تكون هذه الطرق البديلة أكثر تعقيدًا. في البرمجة والبرمجة النصية ، تعني كلمة "أكثر تعقيدًا" أيضًا "أكثر عرضة للأخطاء" ، وأنه من الصعب الحفاظ على التعليمات البرمجية الخاصة بك.
حيث تتفوق المستندات هنا حقًا في أتمتة الأوامر التي تريد إرسالها إلى كمبيوتر بعيد من اتصال تم إنشاؤه من داخل برنامج نصي. إجراء الاتصال أمر سهل ، ولكن بمجرد إجراء الاتصال ، كيف يمكنك "ضخ" أوامرك من البرنامج النصي إلى الغلاف الموجود على الكمبيوتر البعيد؟ تتيح لك المستندات هنا القيام بذلك بكل بساطة.
المبادئ الأساسية للوثائق هنا
يبدو التمثيل الاصطلاحي لوثيقة هنا كما يلي:
الأمر << limit_string . . نص البيانات المتغيرات . . حد_السلسلة
- COMMAND : يمكن أن يكون هذا أي أمر Linux يقبل المدخلات المعاد توجيهها. لاحظ أن أمر
echo
لا يقبل الإدخال المعاد توجيهه. إذا كنت بحاجة للكتابة على الشاشة ، يمكنك استخدام الأمرcat
الذي يفعل. - << : عامل إعادة التوجيه.
- Limit_string : هذه تسمية. يمكن أن يكون ما تريد طالما أنه لا يظهر في قائمة البيانات التي تعيد توجيهها إلى الأمر. يتم استخدامه لتمييز نهاية قائمة النص والبيانات والمتغيرات.
- قائمة البيانات : قائمة البيانات المطلوب تغذيتها للأمر. يمكن أن تحتوي على أوامر ونصوص ومتغيرات. يتم تغذية محتويات قائمة البيانات في سطر واحد من الأوامر في كل مرة حتى تتم مواجهة _limit_string.
من المحتمل أن ترى أمثلة هنا للمستندات التي تستخدم "EOF" كسلسلة حد. نحن لا نفضل هذا النهج. إنه يعمل ، لكن "EOF" تعني "نهاية الملف". بصرف النظر عن الحالة النادرة التي يكون فيها المستند الرئيسي هو آخر شيء في ملف نصي ، يتم استخدام "EOF" بشكل خاطئ.
ستجعل البرامج النصية الخاصة بك أكثر قابلية للقراءة إذا كنت تستخدم سلسلة محددة تشير إلى ما تفعله. إذا كنت ترسل سلسلة من الأوامر إلى كمبيوتر بعيد عبر Secure Shell (SSH) ، فإن سلسلة محددة تسمى شيئًا مثل "_remote_commands" ستكون منطقية تمامًا. لا تحتاج إلى أن تبدأهم بحرف " _
". نفعل ذلك لأنه يميزهم كشيء خارج عن المألوف في نصك.
أمثلة بسيطة
يمكنك استخدام المستندات الموجودة هنا في سطر الأوامر وفي البرامج النصية. عندما تكتب ما يلي في نافذة طرفية ، سترى مطالبة متابعة سطر " >
" في كل مرة تضغط فيها على "إدخال". عندما تكتب سلسلة الحد “_end_of_text” وتضغط على “Enter” ، يتم تمرير قائمة مواقع الويب إلى cat,
ويتم عرضها في نافذة المحطة الطرفية.
قطة << _end_of_text كيف إلى المهوس مراجعة Geek لايف سيفي CloudSavvy IT MindBounce _end_of_text
هذه ليست أكثر التمارين جديرة بالاهتمام ، ولكنها توضح أنه لا يتم إرسال أي شيء إلى الأمر حتى يتم ترتيب قائمة البيانات بالكامل ويتم العثور على سلسلة الحد. لا يتلقى الأمر cat
أي إدخال حتى تدخل سلسلة الحد "_end_of_text" وتضغط على مفتاح "Enter".
يمكننا أن نفعل الشيء نفسه في النص. اكتب هذا المثال أو انسخه في محرر ، واحفظ الملف باسم "heredoc-1.sh" ، وأغلق المحرر.
#! / بن / باش قطة << "_end_of_text" اسم المستخدم الخاص بك هو: $ (whoami) دليل العمل الحالي الخاص بك هو: $ PWD إصدار Bash لديك هو: $ BASH_VERSION _end_of_text
أثناء متابعة هذه المقالة ، في كل مرة تقوم فيها بإنشاء برنامج نصي ، ستحتاج إلى جعله قابلاً للتنفيذ قبل تشغيله. في كل حالة ، استخدم الأمر chmod
. استبدل اسم البرنامج النصي في كل مثال باسم البرنامج النصي المستخدم هنا.
chmod + x heredoc-1.sh
يحتوي هذا البرنامج النصي على متغيرين للبيئة ، $PWD
و $BASH_VERSION
. يتم استبدال أسماء متغيرات البيئة بقيم بياناتها - دليل العمل الحالي وإصدار Bash - عند تنفيذ البرنامج النصي.
يستخدم البرنامج النصي أيضًا استبدال الأوامر في الأمر whoami
. يتم استبدال اسم الأمر بمخرجاته الخاصة. تتم كتابة الإخراج من البرنامج النصي بأكمله في النافذة الطرفية بواسطة الأمر cat. نقوم بتشغيل البرنامج النصي عن طريق تسميته بالاسم:
./heredoc-1.sh
إذا قمت بتعديل البرنامج النصي وقمت بلف السلسلة المحددة في السطر الأول من المستند هنا بين علامتي اقتباس "
" ، يتم تمرير قائمة البيانات إلى أمر المستند هنا حرفيًا. يتم عرض أسماء المتغيرات بدلاً من القيم المتغيرة ، وسيفعل استبدال الأوامر لا يحدث.
#! / بن / باش قطة << - "_end_of_text" اسم المستخدم الخاص بك هو: $ (whoami) دليل العمل الحالي الخاص بك هو: $ PWD إصدار Bash لديك هو: $ BASH_VERSION _end_of_text
./heredoc-1.sh
معالجة أحرف الجدولة
بشكل افتراضي ، سيتم الاحتفاظ بأحرف الجدولة في قائمة البيانات الخاصة بك وكتابتها في نافذة المحطة الطرفية. انسخ هذا المثال واحفظه باسم "heredoc-2.sh." اجعله قابلاً للتنفيذ باستخدام الأمر chmod
. قم بتحرير الأسطر ذات المسافة البادئة للتأكد من أنها تحتوي على حرف أو حرفين جدوليين في بداية السطر بدلاً من سلسلة من المسافات.
#! / بن / باش قطة << _end_of_text اسم المستخدم الخاص بك هو: $ (whoami) دليل العمل الحالي الخاص بك هو: $ PWD إصدار Bash لديك هو: $ BASH_VERSION _end_of_text
./heredoc-2.sh
علامات التبويب مكتوبة في نافذة المحطة.
بإضافة شرطة " -
" إلى عامل إعادة التوجيه ، سيتجاهل المستند الموجود هنا أحرف الجدولة البادئة. احفظ هذا المثال باسم "heredoc-3.sh" واجعله قابلاً للتنفيذ.
#! / بن / باش قطة << - _end_of_text اسم المستخدم الخاص بك هو: $ (whoami) دليل العمل الحالي الخاص بك هو: $ PWD إصدار Bash لديك هو: $ BASH_VERSION _end_of_text
./heredoc-3.sh
يتم تجاهل علامات التبويب. قد يبدو هذا تافهاً ، لكنه طريقة رائعة للتعامل مع علامات التبويب الأمامية بسبب الأقسام ذات المسافة البادئة من النصوص.
عادة ما يتم وضع مسافة بادئة للحلقات والتركيبات المنطقية الأخرى. إذا كان المستند الخاص بك موجودًا في قسم ذي مسافة بادئة من برنامج نصي ، فإن استخدام شرطة " -
" مع عامل إعادة التوجيه يزيل مشكلات التنسيق التي تسببها أحرف الجدولة البادئة.
#! / بن / باش إذا كان هذا صحيحا؛ ومن بعد قطة << - _limit_string السطر 1 بعلامة تبويب بادئة. السطر 2 بعلامة تبويب بادئة. السطر 3 بعلامة تبويب بادئة. _limit_string فاي
إعادة التوجيه إلى ملف
يمكن إعادة توجيه الإخراج من الأمر المستخدم مع المستند الموجود هنا إلى ملف. استخدم " >
" (إنشاء الملف) أو " >>
" (أنشئ الملف إذا لم يكن موجودًا ، قم بإلحاق الملف إذا كان موجودًا) عوامل إعادة التوجيه بعد سلسلة الحد في السطر الأول من المستند هنا.
هذا النص هو "heredoc-4.sh." سيعيد توجيه مخرجاته إلى ملف نصي يسمى "session.txt".
#! / بن / باش قطة << _end_of_text> session.txt اسم المستخدم الخاص بك هو: $ (whoami) دليل العمل الحالي الخاص بك هو: $ PWD إصدار Bash لديك هو: $ BASH_VERSION _end_of_text
./heredoc-4.sh
جلسة القط
توصيل الإخراج إلى أمر آخر
يمكن توجيه الإخراج من الأمر المستخدم في مستند هنا كمدخل لأمر آخر. استخدم الأنبوب “ |
عامل التشغيل " بعد السلسلة المحددة في السطر الأول من مستند هنا. سنقوم بتوجيه الإخراج من أمر المستند هنا ، cat
، إلى sed
. نريد استبدال كل تكرارات الحرف "a" بالحرف "e".
اسم هذا البرنامج النصي "heredoc-5.sh."
#! / بن / باش القط << _end_of_text | sed 's / a / e / g' كيف ل Gaak _end_of_text
./heredoc-5.sh
تم تصحيح "Gaak" إلى "Geek".
إرسال المعلمات إلى وظيفة
يمكن أن يكون الأمر المستخدم مع مستند هنا وظيفة في البرنامج النصي.
يمرر هذا البرنامج النصي بعض بيانات السيارة إلى وظيفة. تقرأ الوظيفة البيانات كما لو أنه قد تم كتابتها من قبل المستخدم. ثم يتم طباعة قيم المتغيرات. احفظ هذا البرنامج النصي باسم "heredoc-6.sh".
#! / بن / باش # وظيفة set_car_details () set_car_details () { قراءة جعل قراءة النموذج قراءة new_used قراءة delivery_collect اقرأ الموقع قراءة السعر } # المستند الموجود هنا الذي يمرر البيانات إلى set_car_details () set_car_details << _mars_rover_data ناسا المثابرة روفر تستخدم تجميع المريخ (طويل ، خط عرض) 77.451865،18.445161 2.2 مليار _mars_rover_data # استرجاع بيانات المركبة صدى "Make: $ make" صدى "Model: $ model" صدى "جديد أو مستعمل: $ new_used" صدى "التسليم أو التجميع: $ delivery_collect" صدى "الموقع: $ location" صدى "Price \ $: $ price"
./heredoc-6.sh
تتم كتابة تفاصيل السيارة في نافذة المحطة.
إنشاء وإرسال بريد إلكتروني
يمكننا استخدام مستند هنا لإنشاء وإرسال بريد إلكتروني. لاحظ أنه يمكننا تمرير المعلمات إلى الأمر أمام عامل إعادة التوجيه. نحن نستخدم أمر Linux mail
لإرسال بريد إلكتروني من خلال نظام البريد المحلي إلى حساب المستخدم المسمى “dave”. يسمح لنا الخيار -s
(الموضوع) بتحديد موضوع البريد الإلكتروني.
يشكل هذا المثال البرنامج النصي "heredoc-7.sh."
#! / بن / باش article = "هنا المستندات" dave << _project_report. حالة حمل العمل الخاصة بالبريد الإلكتروني اسم المستخدم: $ (whoami) تم إكمال المهمة: المقال: $ article _تقرير المشروع
./heredoc-7.sh
لا يوجد إخراج مرئي من هذا البرنامج النصي. ولكن عندما نتحقق من بريدنا ، نرى أنه تم تكوين البريد الإلكتروني وإرساله وتسليمه.
بريد
استخدام المستندات هنا مع SSH
تعد المستندات هنا طريقة فعالة وملائمة لتنفيذ بعض الأوامر على جهاز كمبيوتر بعيد بمجرد إنشاء اتصال SSH. إذا قمت بإعداد مفاتيح SSH بين جهازي الكمبيوتر ، فستكون عملية تسجيل الدخول تلقائية بالكامل. في هذا المثال السريع والقذر ، ستتم مطالبتك بكلمة المرور لحساب المستخدم على الكمبيوتر البعيد.
هذا السيناريو هو "heredoc-8.sh". سنقوم بالاتصال بجهاز كمبيوتر بعيد يسمى "كمبيوتر بعيد". حساب المستخدم يسمى "ديف". نحن نستخدم الخيار -T
(تعطيل تخصيص المحطة الزائفة) لأننا لسنا بحاجة إلى محطة تفاعلية زائفة لتخصيصها لنا.
في قسم "القيام ببعض الأعمال هنا" من البرنامج النصي ، يمكننا تمرير قائمة من الأوامر ، وسيتم تنفيذها على الكمبيوتر البعيد. بالطبع ، يمكنك فقط استدعاء برنامج نصي كان موجودًا على جهاز الكمبيوتر البعيد. يمكن أن يحتوي البرنامج النصي البعيد على جميع الأوامر والإجراءات التي تريد تنفيذها.
كل ما سيفعله البرنامج النصي - heredoc-8.sh - هو تحديث سجل الاتصال على الكمبيوتر البعيد. يتم تسجيل حساب المستخدم وختم الوقت والتاريخ في ملف نصي.
#! / بن / باش ssh -T [email protected] << _remote_commands # القيام ببعض الأعمال هنا # تحديث سجل الاتصال صدى $ USER "-" $ (التاريخ) >> /home/dave/conn_log/script.log _الأوامر
عندما نقوم بتشغيل الأمر ، تتم مطالبتنا بكلمة المرور للحساب على الكمبيوتر البعيد .
./heredoc-8.sh
يتم عرض بعض المعلومات حول الكمبيوتر البعيد ، ويتم إرجاعنا إلى موجه الأوامر.
على الكمبيوتر البعيد ، يمكننا استخدام cat
للتحقق من سجل الاتصال:
القط conn_log / script.log
يتم سرد كل اتصال بالنسبة لنا.
ذات صلة: كيفية إنشاء وتثبيت مفاتيح SSH من Linux Shell
اسم غريب ، ميزات أنيقة
المستندات هنا غريبة ولكنها قوية ، خاصة عند استخدامها لإرسال أوامر إلى كمبيوتر بعيد. سيكون من السهل كتابة روتين احتياطي باستخدام rsync
. يمكن للبرنامج بعد ذلك الاتصال بجهاز الكمبيوتر البعيد ، والتحقق من مساحة التخزين المتبقية ، وإرسال رسالة بريد إلكتروني تنبيهية إذا كانت المساحة آخذة في الانخفاض.
ذات صلة: كيفية عمل نسخة احتياطية من نظام Linux الخاص بك باستخدام rsync