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