Como faço comandos de shell colados invisíveis?

2

Estou usando uma macro AutoHotkey para executar alguns comandos do shell, ou seja,

^'::
SendInput set c=".cshrc-acheong"{ENTER}
SendInput set v=".vimrc-acheong"{ENTER}
SendInput foreach d ( /home/acheong /home/tcama /userhome/andrew.cheong ){ENTER}
SendInput if ( -e $d/$c ) source $d/$c{ENTER}
SendInput if ( -e $d/$v ) alias vim "vim -N -u $d/$v"{ENTER}
SendInput end{ENTER}
return

Se você não estiver familiarizado com o AutoHotkey, não há problema - é o mesmo que colar várias linhas de comandos shell de uma só vez - e muitos de nós vimos como o prompt de comando aparece "de forma assíncrona" à medida que cada linha é executada:

Existeumcomandooutruqueparaesconder(talvezbloquear)stdine,emseguida,executaraentradasemexibi-la(ousuassaídas)?Classificarcomosenhasdedigitação.

Porfavor,sejapoupadodejulgamentossobreoacima:-(Parapreventivamentenegaralgumascoisas:

  1. Eunãousocshporopção;sim,eulioTop10.

  2. Eutrabalhocomcentenasdeservidoresquenãomontamomesmocompartilhamentoderedepara/home-éporissoqueestouusandorsyncparaenviarum"mestre" .cshrc e .vimrc para um local por compartilhamento de rede distinto, para que a macro de teclado acima encontre e carregue o que for encontrado, onde quer que eu esteja.

Atualizar

Eu tentei adicionar stty -echo , ou seja,

^'::
SendInput stty -echo{ENTER}
SendInput set c=".cshrc-acheong"{ENTER}
SendInput set v=".vimrc-acheong"{ENTER}
SendInput foreach d ( /home/acheong /home/tcama /userhome/andrew.cheong ){ENTER}
SendInput if ( -e $d/$c ) source $d/$c{ENTER}
SendInput if ( -e $d/$v ) alias vim "vim -N -u $d/$v"{ENTER}
SendInput end{ENTER}
SendInput stty echo{ENTER}
return

No entanto, os prompts continuam a aparecer:

(Eu pensei em cancelar a configuração de $prompt , mas estou relutante, pois uma das coisas que meu .cshrc faz é precisamente substituir $prompt .)

    
por Andrew Cheong 11.04.2014 / 19:59

3 respostas

4

Não estou familiarizado com o AutoHotKey, portanto, se você não encontrar nenhuma solução, continue lendo.

POSIX especifica o comando read , que permite obter uma linha de entrada enquanto sufoca o eco do terminal (é o que você vê quando digita) com -s . Este também é um bash incorporado, mas você pode verificar seu sistema para ver se ele está presente como um standalone.

Caso contrário, olhando aqui , você pode realizar o mesmo coisa usando stty (outro autônomo) com csh:

stty -echo # turn echo off
# do your input
stty echo # turn echo back on
    
por 11.04.2014 / 20:17
1

Você pode chegar bem perto do que deseja usando o buffer de tela alternativo.
A maioria dos emuladores de terminal (todos?) tem 2 buffers de tela que você pode alternar entre eles. Então, você alterna para o buffer de tela alternativo, executa seus comandos e, em seguida, retorna para o principal.

Basta executar o seguinte antes dos seus comandos:

tput smcup

E no final, corra

tput rmcup

No entanto, isso ainda mostrará o comando tput smcup na tela.
A única maneira que eu posso pensar em esconder o comando é adicionar uma ligação de chave para ele (como ESC + t ). Eu sei que zsh pode fazer isso, mas eu não sei sobre csh .

Se você não tiver o comando tput , poderá fazer o eco dos códigos de escape não processados.
Para putty, isso seria:

echo -e '\e[?47h'

e

echo -e '\e[2J\e[?47l'
    
por 12.04.2014 / 00:00
0

Você deve mkfifo a |pipe bidirecional entre as duas máquinas e escrever para ela em vez de confiar em um terminal de massa. Mas se você deve usar putty, então você deve desligar o controle de fluxo nas configurações e usar o modo raw - stty raw no lado do host e encontrar a opção de terminal raw nas configurações da massa.

    
por 12.04.2014 / 07:25