في البرمجة النصية UNIX قذيفة: ماذا $! توسيع ل؟
سؤال
ما هو المعنى مقابل $! في قذيفة أو شل البرمجة النصية؟ أحاول فهم برنامج نصي له شيء مثل ما يلي.
local@usr> a=1
local@usr> echo $a
1
local@usr> echo $!a
a
إنه طباعة المتغير مرة أخرى. هل كل شيء لذلك؟ ما هي خيارات X الأخرى التي لدينا؟ قليلون أعرفهم $$، $ *، $؟ إذا كان أي شخص يمكن أن يشيرني إلى مصدر جيد، فسيكون ذلك مفيدا. راجع للشغل، هذا في Sun OS 5.8، KSH.
المحلول
المختلف $…
يتم وصف المتغيرات في دليل باش. وبعد وفقا للدليل $!
يتوسع إلى PID من العملية الأخيرة التي تم إطلاقها في الخلفية. يرى:
$ echo "Foo"
Foo
$ echo $!
$ true&
[1] 67064
$ echo $!
67064
[1]+ Done true
في ksh
يبدو أن تفعل الشيء نفسه.
نصائح أخرى
من ksh
صفحة الرجل على نظامي:
$ {! vname} يتوسع إلى اسم المتغير المشار إليه بواسطة VNAME. سيكون هذا VNAME باستثناء عندما يكون VNAME مرجعا للاسم.
للقذيفة التي تسألها، KSH، استخدم دليل KSH., ، وقراءة هذا:
استبدال المعلمة
المعلمة هي معرف، واحد أو أكثر من الأرقام، أو أي من الأحرف *، @، #،؟، -، $، و!..
من الواضح أن هذه هي الخيارات المقبولة $ *، $ @، $ #، $؟، $ -، $$، $!
أكثر يمكن أن تدرج في المستقبل.
للمعلمة $!، من الدليل:
"!" تم استدعاء رقم عملية أمر الخلفية الأخير.
إذا بدأت عملية خلفية، مثل sleep 60 &
, ، ثم سيكون هناك رقم عملية لهذه العملية، والمعلمة $! سوف طباعة رقمها.
$ sleep 60 &
[1] 12329
$ echo "$!"
12329
إذا لم تكن هناك عملية خلفية في التنفيذ (عند بدء تشغيل Shell)، فإن EXANSION فارغ. لديها قيمة فارغة.
$ ksh -c 'echo $!'
إذا كانت هناك عملية خلفية، فسوف تتوسع إلى PID من هذه العملية:
$ ksh -c 'sleep 30 & echo $!'
42586
هذا هو السبب echo $!a
توسيعت إلى a
. وبعد لأنه لا يوجد PID للإبلاغ:
$ ksh -c 'echo $!a'
a
قد تحتوي قذائف أخرى على قائمة مختلفة (عادة ما تكون متشابهة جدا) للتوسعات (معلمة مع حرف واحد فقط وحرف واحد آخر فقط).
على سبيل المثال، يعترف باش هذا *@#?-$!0_
ك "معايير خاصة". بحث دليل باش بالنسبة إلى العنوان "3.4.2 المعلمات الخاصة".
المعلمات الخاصة
قذيفة تعامل العديد من المعلمات خصيصا.
إنه يعطي معرف عملية الخلفية الأخيرة وظيفة الخلفية، يرجى الذهاب من خلال هذا الرابط أدناه
http://www.well.ox.ac.uk/~johnb/comp/unix/ksh.html#specvar
في هو مشغل مرجعي في UNIX، على الرغم من أنه لا يسمى بهذا الاسم.
يشير دائما إلى عملية الأم. حاول الكتابة:! في السادس، يأخذك إلى موجه الأوامر ويمكنك تنفيذ الأوامر كالمعتاد حتى يخرج الأمر.
في في SQLPlus ينفذ أيضا الأمر من موجه الأوامر. جرب هذا في sqlplus
SQL>! LS --- هذا يعطي قائمة الملفات INTHE DIR الحالي.
دولار - من الواضح أن تعطي معرف العملية للعملية الحالية / الأخيرة.