Удар поддерживает разветвление, подобное ветвлению C ()?

Если у Вас есть установленный xdotool, то

xdotool selectwindow getwindowpid

сопровождаемый путем нажатия на рассматриваемое окно возвратит PID.

(Существуют другие способы выбрать рассматриваемое окно, например, если у Вас есть его окно ID, можно просто сделать xdotool getwindowpid . Можно также выбрать по имени или класс, и т.д.),

Я действительно думаю, что это требует некоторых играющих по правилам от имени WM. Я не экспериментировал очень, или должен был.

25
18.02.2011, 02:27
3 ответа

Да. Разветвление записано &:

echo child & echo parent

То, что может смущать Вас, является этим $$ не PID процесса оболочки, это - PID исходного процесса оболочки. Точка создания его этот путь является этим $$ уникальный идентификатор для конкретного экземпляра сценария оболочки: это не изменяется во время выполнения сценария, и это отличается от $$ в любом другом одновременно запускающем скрипте. Один способ получить фактический PID процесса оболочки sh -c 'echo $PPID'.

Поток управления в оболочке не является тем же как C. Если в C Вы записали бы

first(); fork(); second(); third();

затем эквивалентная оболочка

after_fork () { second; third; }
first; after_fork & after_fork

Простая форма оболочки first; child & parent соответствует обычной идиоме C

first(); if (fork()) parent(); else child();

& и $$ существуйте и ведите себя этот путь в каждой оболочке стиля Границы и в (t) csh. $PPID не существовал в orignal Оболочке Bourne, но находится в POSIX (таким образом, это находится в пепле, ударе, ksh, zsh, …).

23
27.01.2020, 19:40
  • 1
    Но это - в основном "ветвление + должностное лицо", не просто ветвление. –  mattdm 18.02.2011, 02:41
  • 2
    @mattdm: Мм? & ветвление, нет никакого вовлеченного должностного лица. Fork+exec - при запуске внешней команды. –  Gilles 'SO- stop being evil' 18.02.2011, 02:47
  • 3
    @mattdm: А-ч, я думаю, что вижу то, что достигает Cory. Существует нет exec, но эти два языка действительно имеют другой поток управления. –  Gilles 'SO- stop being evil' 18.02.2011, 02:55
  • 4
    @Gilles: оператор управления ударом & запускает подоболочку, в которой выполняется данная команда. Ветвление + должностное лицо. Вы не можете просто поместить & без предыдущей команды для выполнения. –  mattdm 18.02.2011, 02:58
  • 5
    Ну, если "Разветвление записано, и" был истинный оператор, Вы могли бы поместить & на строке отдельно. Но Вы не можете. Это не означает "ветвление здесь". Это означает, "выполняют предыдущую команду в фоновом режиме в подоболочке". –  mattdm 18.02.2011, 03:36

Да, это назвало подоболочки. Код Shell в круглой скобке выполняется как подоболочка (ветвление). Однако первая оболочка обычно ожидает ребенка для завершения. Можно сделать это асинхронным использованием & разделитель. Посмотрите его в в действии с чем-то вроде этого:

#!/bin/bash

(sleep 2; echo "subsh 1")&
echo "topsh"

$ колотят subsh.sh

10
27.01.2020, 19:40
  • 1
    Круглые скобки создают подоболочку, но это - fork+wait. & одно только ветвление. Если Вы хотите выполнить больше чем один конвейер в дочернем процессе, достаточно использовать фигурные скобки (которые выполняют группировку, не создавая дочерний процесс): { sleep 2; echo child; } & –  Gilles 'SO- stop being evil' 18.02.2011, 10:31

Нет никакого собственного удара (или, к моему знанию, любой другой типичный *отклоняет оболочку), способ сделать это. Существует много способов породить разветвленные процессы, которые делают что-то еще асинхронно, но я не думаю, что существует что-либо, что следует за точной семантикой ветвления () системный вызов.

Типичный подход должен был бы иметь Вашу икру сценария верхнего уровня от помощников, которые делают просто работу, Вы хотите разделение. Если Вы делаете $0 $@ & или что бы то ни было, Вы запустите вначале снова и должны понять это так или иначе.

Я на самом деле начинаю думать о нескольких умных путях, которыми мог бы сделать просто это....

Но, прежде чем мой мозг также увлекается этим, я думаю, что довольно хорошее правило: при попытке записать что-то в оболочке, и это становится полным умных приемов, и Вы желаете для большего количества функций языка, время переключиться на реальный язык программирования.

6
27.01.2020, 19:40
  • 1
    Хотя Ваша точка хорошо взята - синтаксис удара является возможно трудным, и это пропускает более изящные структуры данных и функции Perl или Python, удар так реален, как это входит в свой домен. Это - проблемно-ориентированный язык, и я спорил бы еще лучше (более сжатый, более простой), чем, например, Python во многих экземплярах. Можно ли администрировать полную комнату систем и не знать ли Python? Да. Можно ли сделать это и не знать ли облизывание удара [программирование]? Я не хотел бы пробовать. После 30 лет программирования оболочки я говорю Вам, что это столь реально, как это добирается. И да, я говорю Python. Но не смущайте молодежь. –  Mike S 10.05.2016, 16:21
  • 2
    Тем не менее технически мне нравится этот ответ больше. Сказать, что "и" ответ на вопрос пользователя, "ветвление однажды, таким образом, две копии того же сценария работают", по моему мнению сбивает с толку. То, что "и" делает, согласно руководству удара, "... выполняет [данную] команду в фоновом режиме в подоболочке". Это должно завершить команду, и это действительно включает ветвление (технически, в Linux, клон ()), но в той точке не работают две копии того же сценария. –  Mike S 10.05.2016, 16:39

Теги

Похожие вопросы