تسمح لك “المستندات هنا” الغريبة باستخدام إعادة توجيه الإدخال / الإخراج داخل نصوص Bash على نظام Linux. إنها طريقة رائعة لأتمتة الأوامر التي تحتاجها للتشغيل على كمبيوتر بعيد.
هنا المستندات
العديد من الأوامر في Linux لها اسمان أو ثلاثة أحرف. هذا ما أدى جزئيًا إلى نشوء فكرة أن Linux يصعب تعلمه ومليء بالأوامر الغامضة. لكن أحد أغرب الأسماء في Linux ليس من الأسماء المختصرة بشكل غامض. “الوثائق هنا” ليست وثائق ، وليس من الواضح ما الذي تشير إليه كلمة “هنا”.
إنها بنية داكنة نسبيًا ، لكنها مفيدة. بالطبع ، هذا نظام Linux ، لذلك هناك أكثر من طريقة لجلد قطة. يمكن إعادة إنتاج بعض الوظائف التي توفرها هذه الوثائق بطرق أخرى. غالبًا ما تكون هذه الطرق البديلة أكثر تعقيدًا. في البرمجة والبرمجة النصية ، تعني كلمة “أكثر تعقيدًا” أيضًا “أكثر عرضة للخطأ” وأن الحفاظ على شفرتك أكثر صعوبة.
حيث تتفوق المستندات هنا في أتمتة الأوامر التي تريد إرسالها إلى كمبيوتر بعيد من اتصال قائم من داخل برنامج نصي. إجراء الاتصال أمر سهل ، ولكن بمجرد إجراء الاتصال ، كيف يمكنك “ضخ” أوامرك من البرنامج النصي إلى الغلاف الموجود على الكمبيوتر البعيد؟ هنا المستندات تسمح لك بالقيام بذلك بكل بساطة.
أساسيات المستند هنا
يبدو التمثيل الاصطلاحي للمستند هنا كما يلي:
COMMAND << cadena_límite . . texto datos variables . . cadena_límite
- COMMAND : يمكن أن يكون أي أمر Linux يقبل المدخلات المعاد توجيهها. لاحظ أن
echo
الأمر لا يقبل الإدخال المعاد توجيهه . إذا كنت بحاجة للكتابة على الشاشة ، يمكنك استخدامcat
الأمر الذي يفعل . - << : عامل إعادة التوجيه.
- Limit_string : هذه تسمية. يمكن أن يكون كل ما تريد طالما أنه لا يظهر في قائمة البيانات التي تعيد توجيهها إلى الأمر. يتم استخدامه لتمييز نهاية قائمة النص والبيانات والمتغيرات.
- قائمة البيانات : قائمة البيانات التي سيتم إرسالها إلى الأمر. يمكن أن تحتوي على أوامر ونصوص ومتغيرات. يتم إدخال محتويات قائمة البيانات في سطر الأوامر سطر واحد في كل مرة حتى يتم العثور على _limit_string.
سترى على الأرجح أمثلة من المستندات هنا التي تستخدم “EOF” كسلسلة حدية. نحن لا نفضل هذا النهج. إنه يعمل ، لكن “EOF” تعني “نهاية الملف”. بصرف النظر عن الحالة النادرة التي يكون فيها مستند البداية هو آخر شيء في ملف نصي ، يتم إساءة استخدام “EOF”.
ستجعل البرامج النصية الخاصة بك أكثر قابلية للقراءة إذا كنت تستخدم سلسلة حدية تشير إلى ما تفعله. إذا كنت ترسل سلسلة من الأوامر إلى كمبيوتر بعيد عبر Secure Shell (SSH) ، فإن سلسلة حدية تسمى شيئًا مثل “_remote_commands” سيكون لها معنى كبير. ليس عليك أن تبدأهم بشرطة سفلية ” _
“. نفعل ذلك لأنه يميزهم كشيء خارج عن المألوف في نصه.
أمثلة بسيطة
يمكنك استخدام المستندات هنا في سطر الأوامر وفي البرامج النصية. عندما تكتب ما يلي في نافذة طرفية ، سترى رسالة >
متابعة سطر » » في كل مرة تضغط فيها على «دخول». عندما تكتب سلسلة الحدود “_end_of_text” وتضغط على “Enter” ، يتم تمرير قائمة مواقع الويب cat,
وعرضها في نافذة المحطة الطرفية.
gato << _end_of_text How-To Geek Revisión Geek LifeSavvy CloudSavvy IT MindBounce _end_of_text
هذا ليس التمرين الأكثر قيمة ، لكنه يُظهر أنه لا يتم إرسال أي شيء إلى الأمر حتى يتم جمع قائمة البيانات بالكامل والعثور على السلسلة المحيطة. و cat
يتلقى قيادة أي إدخال حتى تقوم بإدخال سلسلة الحدود “_end_of_text” واضغط على مفتاح “Enter”.
يمكننا أن نفعل الشيء نفسه في النص. اكتب هذا المثال أو انسخه في محرر ، واحفظ الملف باسم “heredoc-1.sh” وأغلق المحرر.
#! / bin / bash gato << "_end_of_text" Su nombre de usuario es: $ (whoami) Su directorio de trabajo actual es: $ PWD Tu versión de Bash es: $ BASH_VERSION _end_of_text
مع استمرار هذه المقالة ، في كل مرة تقوم فيها بإنشاء برنامج نصي ، ستحتاج إلى جعله قابلاً للتنفيذ قبل تشغيله. في كل حالة ، استخدم chmod
الأمر . استبدل اسم البرنامج النصي في كل مثال باسم البرنامج النصي المستخدم هنا.
chmod + x heredoc-1.sh
يحتوي هذا البرنامج النصي على متغيرين للبيئة $PWD
و $BASH_VERSION
. يتم استبدال أسماء متغيرات البيئة بقيم بياناتها (دليل العمل الحالي وإصدار Bash) عند تشغيل البرنامج النصي.
يستخدم البرنامج النصي أيضا استبدال القيادة في هذا whoami
الأمر . يتم استبدال اسم الأمر بمخرجاته الخاصة. تتم كتابة مخرجات النص بأكمله في النافذة الطرفية باستخدام الأمر cat. نقوم بتشغيل البرنامج النصي من خلال تسميته بالاسم:
./heredoc-1.sh
إذا قمت بتعديل البرنامج النصي وقمت بلف سلسلة الحدود في السطر الأول من المستند هنا بين علامتي اقتباس » "
« ، يتم تمرير قائمة البيانات إلى الأمر هنا المستند حرفياً. يتم عرض أسماء المتغيرات بدلاً من القيم المتغيرة ، ولن يتم تنفيذ استبدال الأوامر.
#! / bin / bash cat << - "_end_of_text" Su nombre de usuario es: $ (whoami) Su directorio de trabajo actual es: $ PWD Tu versión de Bash es: $ BASH_VERSION _end_of_text
معالجة أحرف الجدولة
بشكل افتراضي ، سيتم الاحتفاظ بأحرف الجدولة في قائمة البيانات الخاصة بك وكتابتها في نافذة المحطة الطرفية. انسخ هذا المثال واحفظه باسم “heredoc-2.sh”. اجعله قابلاً للتنفيذ باستخدام chmod
الأمر. قم بتحرير الأسطر ذات المسافة البادئة للتأكد من أنها تحتوي على حرف جدولة واحد أو اثنين في بداية السطر بدلاً من سلسلة من المسافات.
#! / bin / bash gato << _end_of_text Su nombre de usuario es: $ (whoami) Su directorio de trabajo actual es: $ PWD Tu versión de Bash es: $ BASH_VERSION _end_of_text
./heredoc-2.sh
علامات التبويب مكتوبة في نافذة المحطة.
بإضافة شرطة » -
» إلى عامل إعادة التوجيه ، سيتجاهل المستند هنا أحرف الجدولة البادئة. احفظ هذا المثال باسم “heredoc-3.sh” واجعله قابلاً للتنفيذ.
#! / bin / bash gato << - _end_of_text Su nombre de usuario es: $ (whoami) Su directorio de trabajo actual es: $ PWD Tu versión de Bash es: $ BASH_VERSION _end_of_text
./heredoc-3.sh
يتم تجاهل علامات التبويب. قد يبدو هذا تافهاً ، لكنه طريقة جيدة للتعامل مع علامات التبويب الأولية بسبب الأقسام ذات المسافات البادئة من النصوص.
غالبًا ما يتم وضع مسافة بادئة للحلقات والتركيبات المنطقية الأخرى. إذا كان المستند الخاص بك موجودًا هنا في قسم ذي مسافة بادئة من برنامج نصي ، فإن استخدام شرطة ” ” مع عامل إعادة التوجيه يزيل مشاكل التنسيق التي تسببها أحرف الجدولة البادئة -
.
#! / bin / bash si es verdad; luego cat << - _limit_string Línea 1 con tabulación inicial. Línea 2 con tabulación inicial. Línea 3 con una pestaña inicial. _limit_string fi
يمكن إعادة توجيه إخراج الأمر المستخدم مع المستند هنا إلى ملف. استخدم عوامل إعادة التوجيه ” >
” (أنشئ الملف) أو ” >>
” (أنشئ الملف إذا لم يكن موجودًا ، وألحقه إذا كان موجودًا) بعد سلسلة الحدود في السطر الأول من المستند هنا.
هذا البرنامج النصي هو “heredoc-4.sh”. سيعيد توجيه مخرجاته إلى ملف نصي يسمى “session.txt”.
#! / bin / bash cat << _end_of_text> session.txt Su nombre de usuario es: $ (whoami) Su directorio de trabajo actual es: $ PWD Tu versión de Bash es: $ BASH_VERSION _end_of_text
./heredoc-4.sh
gato sesión de texto
قم بتوصيل الإخراج إلى أمر آخر
يمكن توجيه إخراج الأمر المستخدم في مستند هنا كمدخل لأمر آخر. استخدام في الأنابيب |
المشغل » » بعد سلسلة الحدود في السطر الأول من الوثيقة هنا. سنقوم بتوجيه إخراج الأمر هنا المستند cat
، إلى sed
. نريد استبدال كل تكرارات الحرف “a” بالحرف “e”.
اسم هذا البرنامج النصي “heredoc-5.sh”.
#! / bin / bash gato << _end_of_text | sed 's / a / e / g' Cómo Para Gaak _end_of_text
./heredoc-5.sh
«جااك» يصحح نفسه إلى «المهوس».
إرسال المعلمات إلى وظيفة
يمكن أن يكون الأمر المستخدم مع المستند هنا وظيفة في البرنامج النصي.
يمرر هذا البرنامج النصي بعض البيانات من السيارة إلى الوظيفة. تقرأ الوظيفة البيانات كما لو تم إدخالها بواسطة مستخدم. ثم يتم طباعة القيم المتغيرة. احفظ هذا البرنامج النصي باسم “heredoc-6.sh”.
#! / bin / bash # la función set_car_details () set_car_details () { leer hacer leer modelo leer new_used leer delivery_collect leer ubicación leer precio } # El documento aquí que pasa los datos a set_car_details () set_car_details << _mars_rover_data NASA Perseverance Rover Usado Recolectar Marte (largo, lat) 77.451865,18.445161 2,2 mil millones _mars_rover_data # Recupera los detalles del vehículo echo "Make: $ make" echo "Modelo: $ modelo" echo "Nuevo o Usado: $ new_used" echo "Entrega o recogida: $ delivery_collect" echo "Ubicación: $ ubicación" echo "Precio \ $: $ precio"
./heredoc-6.sh
تفاصيل السيارة مكتوبة في نافذة المحطة.
إنشاء وإرسال بريد إلكتروني
يمكننا استخدام مستند هنا لإنشاء رسالة بريد إلكتروني وإرسالها. لاحظ أنه يمكننا تمرير المعلمات إلى الأمر أمام عامل إعادة التوجيه. نحن باستخدام لينكس mail
قيادة ل إرسال البريد الإلكتروني من خلال نظام البريد المحلي إلى حساب المستخدم يدعى “ديف”. و -s
يسمح خيار (الموضوع) لنا لتحديد موضوع البريد الإلكتروني.
يشكل هذا المثال البرنامج النصي “heredoc-7.sh”.
#! / bin / bash artículo = "Aquí Documentos" mail -s 'Estado de carga de trabajo' dave << _project_report Nombre de usuario: $ (whoami) Ha completado la tarea: Artículo: $ artículo _informe del proyecto
./heredoc-7.sh
لا يوجد إخراج مرئي من هذا البرنامج النصي. ولكن عندما نتحقق من بريدنا ، نرى أن البريد الإلكتروني قد تم تكوينه وإرساله وتسليمه.
correo
استخدام المستندات هنا مع SSH
تعد المستندات هنا طريقة فعالة ومناسبة لتشغيل بعض الأوامر على كمبيوتر بعيد بمجرد إنشاء اتصال SSH. إذا قمت بتكوين مفاتيح SSH بين جهازي الكمبيوتر ، فستكون عملية تسجيل الدخول تلقائية تمامًا. في هذا المثال السريع والقذر ، ستتم مطالبتك بكلمة المرور لحساب المستخدم على الكمبيوتر البعيد.
هذا السيناريو هو “heredoc-8.sh”. سنقوم بالاتصال بجهاز كمبيوتر بعيد يسمى “كمبيوتر بعيد”. حساب المستخدم يسمى “ديف”. نحن نستخدم -T
الخيار (تعطيل تخصيص المحطة الزائفة) لأننا لسنا بحاجة إلى محطة تفاعلية زائفة لتخصيصها لنا.
في قسم “القيام ببعض الأعمال هنا” من البرنامج النصي ، يمكننا تمرير قائمة بالأوامر ، ويمكن تشغيلها على الكمبيوتر البعيد. بالطبع ، يمكنك فقط استدعاء برنامج نصي كان موجودًا على جهاز الكمبيوتر البعيد. يمكن أن يحتوي البرنامج النصي البعيد على جميع الأوامر والإجراءات التي تريد تشغيلها.
كل نصوصنا ، heredoc-8.sh ، سوف يقوم بتحديث سجل اتصال على الكمبيوتر البعيد. يتم تسجيل حساب المستخدم وطابع التاريخ والوقت في ملف نصي.
#! / bin / bash ssh -T dave@remote-pc.local << _comandos_remoto # trabaja un poco aquí # actualizar el registro de conexión echo $ USER "-" $ (fecha) >> /home/dave/conn_log/script.log _remote_commands
عندما ننفذ الأمر ، يُطلب منا إدخال كلمة مرور الحساب على الكمبيوتر البعيد .
./heredoc-8.sh
يتم عرض بعض المعلومات حول الكمبيوتر البعيد ونعود إلى موجه الأوامر.
على الكمبيوتر البعيد ، يمكننا استخدامه cat
للتحقق من سجل الاتصال:
cat conn_log / script.log
يتم سرد كل اتصال بالنسبة لنا.
اسم غريب ، ميزات رائعة
المستندات هنا غريبة ولكنها قوية ، خاصة عند استخدامها لإرسال أوامر إلى كمبيوتر بعيد. سيكون من السهل جدًا كتابة روتين احتياطي باستخدام rsync
. يمكن للبرنامج بعد ذلك الاتصال بجهاز الكمبيوتر البعيد ، والتحقق من مساحة التخزين المتبقية ، وإرسال رسالة تنبيه بالبريد الإلكتروني إذا كانت المساحة منخفضة.