В сценариях оболочки 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}
      Expands  to the name of the variable referred to by vname.  This
      will be vname except when vname is a name reference.

Для оболочки, которую вы запрашиваете, ksh, используйте руководство по ksh, и прочтите это:

Замена параметров
Параметр - это идентификатор, одна или несколько цифр или любой из символов *, @, #, ?, -, $, и !.

Понятно, что это принятые варианты $*, $@, $#, $?, $-, $$, и $!.
В будущем можно было бы включить еще больше.


Для параметра $!, из руководства:

"!" Номер процесса последней вызванной фоновой команды.

если вы запустите фоновый процесс, например sleep 60 &, тогда будет номер процесса для такого процесса и параметр $!будет выведен его номер.

$ sleep 60 &
[1] 12329
$ echo "$!"
12329

Если фоновый процесс не выполняется (например, при запуске командной оболочки), исключение пустое.Он имеет нулевое значение.

$ ksh -c 'echo $!'

Если существует фоновый процесс, он будет расширен до PID такого процесса:

$  ksh -c 'sleep 30 & echo $!'
42586

Вот почему echo $!a расширен до a.Это потому, что нет PID для отчета:

$  ksh -c 'echo $!a'
a

Другие оболочки могут иметь другой (обычно довольно похожий) список расширений (параметр, содержащий только один символ $ и один следующий).
Например, bash распознает это *@#?-$!0_ как "Специальные параметры".Поиск руководство по Bash для заголовка "3.4.2 Специальные параметры".

Специальные Параметры
Оболочка специально обрабатывает несколько параметров.

Он предоставляет идентификатор процесса последнего backgroundjob или фоновой функции Пожалуйста, перейдите по этой ссылке ниже

http://www.well.ox.ac.uk/~johnb/comp/unix/ksh.html#specvar

!является оператором ссылки в unix, хотя он и не вызывается с таким именем.

Это всегда относится к материнскому процессу.Попробуйте ввести :!в vi вы попадаете в командную строку, и вы можете выполнять команды как обычно до выхода из команды.

!в SQLPLUS также выполняется команда из командной строки.попробуйте это в sqlplus

SQL> !ls --- это выдает список файлов в текущем каталоге.

$!- очевидно, что дает идентификатор процесса текущего / последнего процесса.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top