Aqui está uma solução que irá unlockpt()
um novo descritor pty e escreverá seu ptsname()
para stdout para você.
<<\C cc -xc - -o pts
#include <stdio.h>
int main(int argc, char *argv[]) {
if(unlockpt(0)) return 2;
char *ptsname(int fd);
printf("%s\n",ptsname(0));
return argc - 1;
}
C
Que apenas compila um pequeno programa em C que tenta chamar unlockpt()
em seu arquivo stdin e, se for bem sucedido, imprime o nome do recém-criado e desbloqueado pty em stdout
ou então silenciosamente retorna 2.
Em um sistema linux - dadas permissões apropriadas (em geral, elas são mais facilmente obtidas adicionando-se ao grupo tty
) - um novo descritor pty pode ser obtido tão facilmente quanto. .
exec 3<>/dev/ptmx
... para obter o fd master-side no shell atual, desde que você tenha compilado o programa acima em ./
...
slave=$(./pts <&3)
... farão seu novo descritor praticamente utilizável e colocarão o nome do dispositivo no valor da variável $slave
.
Em seguida, desde que o pacote util_linux
tenha sido instalado em seu sistema, você poderá instalar um novo processo setsid()
como:
setsid -c sh 3>&- <>"$slave" >&0 2>&1
O qual irá lançar um processo sh
interativo como o líder de sessão do seu pty e sair, essencialmente baseando-se no shell interativo. O shell em segundo plano interpretará qualquer coisa escrita em >&3
como entrada do usuário. Uma coisa particularmente útil para escrever pode parecer:
echo "exec >$(tty) 2>&1" |
cat - /dev/tty >&3
Para redirecionar temporariamente todas as saídas do seu shell de segundo plano e seus filhos para o seu terminal atual, redirecionando simultaneamente toda a sua entrada de teclado de volta para o seu shell de segundo plano enquanto o cat
sobreviver. No entanto, o /dev/tty
do shell em segundo plano é o pty em slave e, portanto, o staus-quo é restaurado com a mesma facilidade:
echo 'exec >/dev/tty 2>&1' >&3
O mesmo tipo de coisa pode funcionar a partir de cron
, mas você gostaria apenas de escrever o script i / o, é claro, ou configurar um relé de pipe para fazer o malabarismo para você automaticamente.
Veja Como eu obtenho este artigo e o que posso fazer com ele? para mais informações.