Почему отречься не работает на последней работе, если я справлюсь с этим?
Скажем, у меня есть процесс, например, 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
примет оба.
Рекомендации