في البرمجة النصية UNIX قذيفة: ماذا $! توسيع ل؟

StackOverflow https://stackoverflow.com/questions/1672960

  •  16-09-2019
  •  | 
  •  

سؤال

ما هو المعنى مقابل $! في قذيفة أو شل البرمجة النصية؟ أحاول فهم برنامج نصي له شيء مثل ما يلي.

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 الحالي.

دولار - من الواضح أن تعطي معرف العملية للعملية الحالية / الأخيرة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top