Поперше; Після того як ви розпочали процес, ви можете створити його, попередньо зупинивши його (натисніть Ctrl- Z), а потім ввівши bg
його, щоб відновити його у фоновому режимі. Тепер це "робота", і його stdout
/ stderr
/ stdin
все ще підключені до вашого терміналу.
Ви можете розпочати процес у фоновому режимі негайно, додавши "&" до кінця:
firefox &
Щоб запустити його у фоновому режимі безшумно, скористайтеся цим:
firefox </dev/null &>/dev/null &
Деякі додаткові відомості:
nohup
це програма, яку ви можете використовувати для запуску програми так, щоб її stdout / stderr можна було надіслати у файл замість цього і таким чином, що закриття батьківського скрипту не допоможе дітям. Однак вам потрібно було передбачити, щоб використовувати його перед запуском програми. Через те, як nohup
працює, ви не можете просто застосувати його до запущеного процесу .
disown
це bash вбудований, який видаляє завдання оболонки зі списку завдань оболонки. Це в основному означає, що ви більше не можете його використовувати fg
, bg
але що ще важливіше, коли ви закриваєте свою оболонку, вона більше не висить і не надсилатиме SIGHUP
дитині цю дитину. На відміну від цього nohup
, disown
використовується після запуску процесу та фонового зображення.
Що ви не можете зробити, це змінити stdout / stderr / stdin процесу після його запуску. Принаймні не зі шкаралупи. Якщо ви запустите ваш процес і скажете йому, що його stdout - це ваш термінал (це те, що ви робите за замовчуванням), то цей процес налаштований на вихід на ваш термінал. У вашій оболонці немає жодної справи із налаштуванням FD процесів, це суто те, чим керує сам процес. Сам процес може вирішити, закривати його stdout / stderr / stdin чи ні, але ви не можете використовувати свою оболонку, щоб змусити це робити.
Для управління результатом фонового процесу у вас є безліч варіантів сценаріїв, "нохуп", мабуть, першим приходить на думку. Але для інтерактивних процесів ви починаєте, але забули замовкнути ( firefox < /dev/null &>/dev/null &
), ви не можете зробити багато чого.
Я рекомендую вам отримати GNU screen
. За допомогою екрану ви можете просто закрити свою запущену оболонку, коли вихід процесу стає набридним і відкрити нову ( ^Ac
).
О, і до речі, не використовуйте " $@
" там, де ви його використовуєте.
$@
означає, що $1
, $2
, $3
..., яка перетворить вашу команду на:
gnome-terminal -e "vim $1" "$2" "$3" ...
Мабуть, це не те, що ви хочете, оскільки -e бере лише один аргумент. Використовуйте, $1
щоб показати, що ваш сценарій може обробляти лише один аргумент.
Дійсно важко змусити кілька аргументів працювати належним чином за сценарієм, який ви дали (разом із gnome-terminal -e
), тому що -e
використовується лише один аргумент, який є командним рядком оболонки. Вам доведеться кодувати свої аргументи в один. Найкращий і надійний, але досить незграбний спосіб такий:
gnome-terminal -e "vim $(printf "%q " "$@")"