Por motivos históricos, há dois caracteres que representam quebras de linha: alimentação de linha (comumente representada como LF, \n
, 2
, Ctrl + J,…) e retorno de carro (CR, \r
, 5
, Ctrl + M). O Unix usa LF como o caractere terminador de linha, mas os teclados enviam CR quando você pressiona Retornar . Alguns aplicativos reconhecem uma chave Alimentamento de Linha (que existe em alguns teclados raros que não foram feitos para o mercado de PCs), mas isso é raro.
Experimentalmente, quando há uma quebra de linha na string, xdotool envia uma chave Linefeed . Não me surpreende que alguns aplicativos não reconheçam isso. Você pode fazer com que ele envie Return , substituindo as novas linhas pelos retornos de carro.
sleep 1; xdotool type -- "$(xsel -bo | tr \n \r | sed s/\r*\$//)"
Sua solução alternativa também pode funcionar. Defina IFS
como um valor vazio, caso contrário, read
retira o espaço em branco inicial e final em cada linha (é por isso que as guias estão desaparecendo). E não envie um Return após a última linha. (Isso não é estritamente equivalente ao método de substituição de comando: com uma substituição de comando, todas as linhas vazias finais são removidas; com o método a seguir, apenas a nova linha final, se houver, é ignorada.)
sleep 1
xsel -bo | {
IFS= read -r LINE;
xdotool type -- "$LINE";
while IFS= read -r LINE; do
xdotool key Return;
xdotool type -- "$LINE";
done;
}
Nota: Eu não tentei nada no VNC, então sua milhagem pode variar.