Почему отречься не работает на последней работе, если я справлюсь с этим?

Скажем, у меня есть процесс, например, VIM с Ctrl-Z. Затем я запускаю xterm, используя следующую команду xterm &> /dev/null &, Если я просто наберу "Отказаться", я потеряю процесс vim. Вместо этого я должен ввести PID процесса xterm, чтобы отречься от него.

Есть ли способ обойти это или есть причина, по которой это происходит?

1 ответ

Решение

Как исправить (короткая версия)

У вас есть несколько способов сделать это:

  • С %- Вы попросите отказаться от последней фоновой работы.

    xterm &> /dev/null & disown %-
    
  • С $! вместо этого вы попросите отказаться от последнего выполненного задания (через его PID).

    xterm &> /dev/null & disown $!
    

Так что потребуется написать еще пару символов, но, по крайней мере, вы можете выбрать, какие из них:-)

Причины

Причина здесь все: когда вы выполняете задание, отправляя его в фоновый режим с & по сути это не меняет текущую работу, а только предыдущую. Текущая работа остается той, что была раньше.

Еще несколько слов и пример

Вы можете проверить сказанное выше с помощью команды jobs, сравнивая его результаты до и после запуска задания в фоновом режиме.

  • Раньше: предположим, у вас есть пара фоновых процессов, запущенных из терминала (например, запущенных с dolphin & а также kate &).
    Теперь вы начинаете vim и вы приостановите его с помощью Ctrl-Z.
    Выход из jobs будет:

    [1]   Running                 dolphin . &
    [2]-  Running                 kate  &
    [3]+  Stopped                 vim
    

    vim текущая работа, помеченная +, а также kate предыдущий, помеченный -,

    В справочном руководстве bash глава 7.1 [ 1 ] объясняет, что
    "В выводе, относящемся к заданию (например, выводе команды заданий), текущее задание всегда помечается знаком" + ", а предыдущее задание -" - "."

  • После: Наконец, вы пишете свою команду xterm &> /dev/null & (без disown).

    Спрашивая jobs на этот раз он ответит:

    [1]   Running                 dolphin .
    [2]   Running                 kate 
    [3]+  Stopped                 vim
    [4]-  Running                 xterm &> /dev/null &
    

    Обратите внимание, что vim все еще помечен + а также xterm с -,
    Последнее фоновое задание отмечено - является xterm и не больше kate &,

  • Другими словами, система действует так, как будто

    • Сначала это работает xterm: новая команда (xterm) становится текущим и vim предыдущий.
    • затем xterm отправляется в фоновом режиме и элемент управления возвращается к предыдущему в списке (vim с его статусом), который снова становится текущим и снова помечается +, xterm вместо этого новая предыдущая работа, и она помечена -,
    • В конце вы найдете обновленную только предыдущую работу (-), а не текущую (+).

Так как вы можете позвонить disown с последующим номером работы или PID у вас есть два варианта

  • %-: на предыдущую работу можно ссылаться с помощью %-, может быть, легче запомнить, если вы думаете, что также на рабочих местах помечен -

  • $!: PID последнего задания, которое выполняется в фоновом режиме, находится в специальном параметре $! [ 2 ].

Команда disown примет оба.

Рекомендации

Другие вопросы по тегам