23 октября 2007 г.

Команды bg, fg и jobs

До недавнего времени, если приходилось работать в unix или linux и редактировать несколько текстовых файлов, я открывал несколько gvim или открывал несколько терминалов и редактировал в каждом по одному файлу. Мне также приходилось использовать несколько терминалов, например, чтобы выполнять редактирование и сборку программы.

Но, как говорится, век живи, век учись. Так уж получилось, что последнее время пришлось много работать по ssh на удаленных серверах. А там и редактирование, и сборка, и запуск... В общем, несколько терминалов с ssh открыть, конечно, можно, да только слишком уж неудобно. Пришлось читать букварь :)


Оказалось, что текущий foreground процесс, выполняемый в терминале, можно приостановить нажатием клавиш Ctrl+Z. При этом процесс станет фоновым и освободит терминал для выполнения других команд. Чтобы продолжить выполнение процесса в фоновом режиме, нужно просто выполнить команду bg.

Например:

> find / >foundfiles.txt
Нажимаем Ctrl+Z
[1]+ Stopped find / >foundfiles.txt
Процесс приостановлен. Теперь можно продолжить его выполнение в фоне, если нужно.
> bg
[1]+ find / >foundfiles.txt &
>

Теперь команда выполняется в фоновом режиме. А в терминале можно запускать чего-нибудь еще. Можно было запустить команду find сразу в фоновом режиме — эти варианты эквивалентны:

> find / >foundfiles.txt &

Но при работе с vim мне помогли другие волшебные команды — fg и jobs.

Предположим, нам нужно редактировать сразу три текстовых файла и закрывать редакторы после каждого редактирования совсем нежелательно:

> vim file1.txt
Нажимаем Ctrl+Z
[1]+ Stopped vim file1.txt
> vim file2.txt
Нажимаем Ctrl+Z
[2]+ Stopped vim file2.txt
> vim file3.txt
Нажимаем Ctrl+Z
[3]+ Stopped vim file3.txt
>

Сейчас все три открытых редактора приостановлены и находятся в ожидании дальнейших указаний. Можно посмотреть список фоновых задач с помощью команды jobs:

> jobs
[1]  Stopped vim file1.txt
[2]- Stopped vim file2.txt
[3]+ Stopped vim file3.txt

Число в квадратных скобках — идентификатор фонового процесса. Символ "+" обозначает последний приостановленный процесс; символ "-" — предпоследний.

Теперь можно переключиться на любой из "висячих" vim'ов командой fg (команда bg означает background, а fg — foreground).

Запуск fg без параметров включит нам последний остановленный vim (тот, который помечен плюсиком). В данном случае, это vim с файлом file3.txt. Этого же эффекта можно добиться выполнив команду "fg +".

Запуск команды "fg -" переключит нас на предпоследний остановленный процесс, то есть на vim file2.txt.

Также можно переключаться между процессами, используя их идентификатор. Например, "fg 1" или "fg 3".

Надо сказать, что мою unix'овую жизнь эти команды существенно облегчили. Жаль, что времени читать unix-букварь обычно не хватает :)

8 комментариев:

  1. Спасибо, так же нет времени читать man'ы :) Случайно наткнулся, очень юзабельно :)

    ОтветитьУдалить
  2. для всего этого в виме реалезованы буфферы, сплиты и табы (tabnew, split).
    Так что то что написано в статье виму совсем не нужно, однако прекрасно подойдет для других приложений)

    ОтветитьУдалить
  3. Про сплиты - согласен, если экран не 80х40. А вот табами, имхо, пользоваться очень неудобно. Но это кто как привык...

    ОтветитьУдалить
  4. спасибо) очень ценная инфа

    ОтветитьУдалить
  5. наконец то я понял как это работает )

    ОтветитьУдалить
  6. screen имхо удобнее

    ОтветитьУдалить