Seguindo isso , pode muito bem fazer com que o seu último plano funcione. Para que o comando a ser enviado não seja processado pelo shell, ele deve estar na forma de uma string quando atingir o pipe (assim, echo "command"
, não echo 'command'
). Em seguida, ele deve ser lido por um processo em segundo plano ( igualmente um daemon , mas não necessariamente) iniciado no terminal apropriado. Deve ser eval uado pelo mesmo processo.
Mas é boiler-platey para ter um script por canal. Então, vamos generalizar a criação de um script como term-pipe-r.sh
(não se esqueça de chmod +x
it!):
#!/bin/bash
pipe=$1 # the pipe name is the first argument
trap 'rm -f "$pipe"' EXIT # ignore exit and delete messages until the end
if [[ ! -p $pipe ]]; then # if the pipe doesn't exist, create it
mkfifo $pipe
fi
while true # cycle eternally..
do
if read line <$ pipe; then
if [[ "$line" == 'close the term-pipe pipe' ]]; then
break
# if the pipe closing message is received, break the while cycle
fi
echo # a line break should be used because of the prompt
eval $line # run the line: as this script should be started
fi # in the target terminal,
done # the line will be run there.
echo "<pipe closing message>" # custom message on the end of the script
Então diga que você quer que /dev/tty3
receba comandos: vá lá, faça
./term-pipe-r.sh tty3pipe & # $1 will be tty3pipe (in a new process)
E para enviar comandos, a partir de qualquer terminal (mesmo de si mesmo):
echo "command" > tty3pipe
ou para executar um arquivo lá:
cat some-script.sh > tty3pipe
Observe que esse canal ignora arquivos como .bashrc
e os aliases ali, como alias ls='ls --color'
. Espero que isso ajude alguém lá fora.
Editar (nota - vantagem do não daemon ):
Acima eu falei sobre o leitor de pipe não ser necessariamente um daemon , mas na verdade, eu verifiquei o diferenças , e acontece que é muito melhor ser um mero processo em segundo plano neste caso. Como dessa forma, quando você fecha o terminal, um sinal EXIT
( SIGHUP
, SIGTERM
, ou qualquer outro) também é recebido pelo script e o canal é excluído (consulte a linha que começa com trap
no script) automaticamente, evitando um processo e arquivo inúteis (e talvez outros se houvesse tal redirecionamento para o pipe inútil).
Editar (automação):
Ainda assim, é chato ter que executar um script que você (eu, pelo menos), provavelmente quer na maioria das vezes. Então, vamos automatizar isso! Deve iniciar em qualquer terminal, e uma coisa que todos eles lêem é .bashrc
. Além disso, é uma droga ter que usar ./term-pipe-r.sh
. Então, alguém pode fazer:
cd /bin # go to /bin, where Bash gets command names
ln -s /directory/of/term-pipe-r.sh tpr # call it tpr (terminal pipe reader)
Agora, para executá-lo, você precisará apenas de tpr tty3pipe &
in /dev/tty3
sempre que desejar. Mas por que fazer isso quando você pode tê-lo feito automaticamente? Portanto, isso deve ser adicionado a .bashrc
. Mas espere: como vai saber o nome do pipe? Pode basear o nome no TTY (que pode ser conhecido com o comando tty
), usando simples REGEX em sed
(e alguns truques ). O que você deve adicionar ao ~/.bashrc
será então:
pipe="$(sed 's/\/dev\///' <<< 'tty' | sed 's/\///')pipe"
# ^^^- take out '/dev/' and other '/', add 'pipe'
tpr $pipe & # start our script with the appropriate pipe name