لإصلاح خطأ في أمر Less من خلال الإشارة إلى no.من المعلمات
-
22-08-2019 - |
سؤال
هذا السؤال مبني على هذا الموضوع.
الرمز
function man()
{
man "$1" > /tmp/manual; less /tmp/manual
}
مشكلة: إذا استخدمت خيارًا واحدًا، فلن يعرف الأمر مكان الدليل المطلوب
على سبيل المثال،
man -k find
يعطيني خطأ، لأن المرجع خاطئ.يقرأ الأمر -k
كدليل.
محاولتي لحل المشكلة في الكود الزائف
if no parameters
run the initial code
if one parameter
run: man "$2"
...
بمعنى آخر، نحتاج إلى إضافة علامة اختيار إلى البداية
كود مزيف
man $optional-option(s) "$n" > /tmp/manual; less /tmp/manual
حيث $ن
- ن = 1 إذا كانت الخيارات صفر
- ن = 2 إذا كان هناك خيار واحد
- ن = 3 إذا كان هناك خياران
- ....
كيف يمكنك إجراء "فحص الخيارات" بحيث يمكنك تغيير قيمة $n؟
المشكلة المطورة: لعمل حلقتين if للمواقف من n=1 إلى n=2
المحلول
ماذا عن تمرير جميع الحجج
function man()
{
man $@ > /tmp/manual; less /tmp/manual
}
ما هو الخلل في أقل مما ذكرته في العنوان؟
نصائح أخرى
أولاً، يمكنك تمرير جميع وسيطات وظيفتك إلى man
باستخدام $*
أو $@
.يمكنك القراءة man sh
للحصول على تفاصيل دقيقة عن الفرق بين الاثنين؛القصة القصيرة تُستخدم دائمًا تقريبًا "$@"
مع علامات الاقتباس المزدوجة.
ثانيا، الملف المؤقت غير ضروري.يمكنك جعل هذا أكثر نظافة عن طريق توصيل مخرجات الأنابيب man
مباشرة الى less
:
function man() {
man "$@" | less
}
بالمناسبة، إذا كنت تحاول فقط استخدام جهاز بيجر مختلف (man
الاستخدامات more
وتريد مربي الحيوانات less
) هناك معترف به عادة PAGER
متغير البيئة الذي يمكنك تعيينه لتجاوز جهاز النداء الافتراضي.يمكنك إضافة هذا إلى الخاص بك ~/.bashrc
على سبيل المثال لإخبار كافة البرامج للاستخدام less
عند عرض شاشات متعددة للإخراج:
export PAGER=less
للإجابة على سؤالك الدقيق، يمكنك التحقق من عدد الوسائط باستخدامها $#
:
if [ $# -eq 0 ]; then
: # No arguments
elif [ $# -eq 1 ]; then
: # One argument
# etc.
قد تجد أيضًا shift
الأمر مفيد.يتم إعادة تسمية $2
ل $1
, $3
ل $2
, ، وما إلى ذلك وهلم جرا.غالبًا ما يتم استخدامه في حلقة لمعالجة وسيطات سطر الأوامر واحدة تلو الأخرى:
while [ $# -gt 1 ]; do
echo "Next argument is: $1"
shift
done
echo "Last argument is: $1"