У меня есть функция, указанная ниже в моем ~ / .profile
, по тем же причинам,
k(){
{ echo PERMS LINKS OWNER GROUP SIZE modMONTH modDATE modTIME NAME
ls -l; } |
column -t |
grep -v "total"
}
Я добавил код, чтобы :
interact() {
pid=$1
! ps -p $pid && return
ls -ld /proc/$pid/fd/*
sleep 5; kill -1 $pid # TEST SIGNAL TO PARENT
}
run() {
exec {in}<&0 {out}>&1 {err}>&2
{ coproc "$@" 0<&$in 1>&$out 2>&$err; } 2>/dev/null
exec {in}<&- {out}>&- {err}>&-
{ interact $! <&- >/tmp/whatever.log 2>&1& } 2>/dev/null
fg %1 >/dev/null 2>&1
wait 2>/dev/null
}
fg %1
будет работать для всех команд (изменить %1
по мере необходимости для параллельных заданий )и при нормальных обстоятельствах произойдет одно из двух :
interact()
немедленно вернется, так как делать нечего, и fg
ничего не сделает. interact()
может взаимодействовать (, например. отправить HUP сопроцессу через 5 секунд ), и fg
переведет сопроцесс на передний план, используя тот же стандартный ввод/вывод/ошибку, с которым он был первоначально запущен (, вы можете проверить это с помощьюls -l /proc/<pid>/df
).Перенаправления на /dev/null в последних трех командах носят косметический характер. Они позволяют run <command>
выглядеть точно так же, как если бы вы запустили command
отдельно.
It fails, I presume, because Vim detects that it is a background process and doesn't have terminal access, so instead of popping up an edit window it suspends itself. I want to fix it so Vim behaves normally.
На самом деле это не имеет ничего общего с передним или задним планом.
Vim вызывает функцию isatty()
, которая сообщает, что не подключена к терминалу. Единственный способ исправить это — подключить vim к терминалу. Есть два способа сделать это:
isatty()
будет указывать на канал, а не на терминал, и vim будет работать в фоновом режиме. Я не совсем понимаю вопрос, но вот кое-что из того, что вы ищете.
Передний план и задний план являются понятиями оболочки.
fg
)или на задний план(bg
). «command»&
. fg %jobid