output “script” para a legibilidade do pastebin

2

Como faço para colar a saída do comando script (typescript; "man script") para que fique mais legível ?

Script started on 2017-10-27 06:20:56-0700
]0;thufir@dur: ~/IdeaProjects[01;32mthufir@dur[00m:[01;34m~/IdeaProjects[00m$ 
]0;thufir@dur: ~/IdeaProjects[01;32mthufir@dur[00m:[01;34m~/IdeaProjects[00m$ tree
[01;34m.[00m
├── kotlin
└── [01;34mkotlinHelloWorld[00m
    ├── kotlinHelloWorld.iml
    ├── [01;34mout[00m
    │   └── [01;34mproduction[00m
    │       └── [01;34mkotlinHelloWorld[00m
    └── [01;34msrc[00m
        └── Main.kt

5 directories, 3 files
]0;thufir@dur: ~/IdeaProjects[01;32mthufir@dur[00m:[01;34m~/IdeaProjects[00m$ 
]0;thufir@dur: ~/IdeaProjects[01;32mthufir@dur[00m:[01;34m~/IdeaProjects[00m$ cat kotlinHelloWorld/src/Main.kt
class Main {



    fun main(args: Array<String>) {
        println("Hello, world!")
    }
}]0;thufir@dur: ~/IdeaProjects[01;32mthufir@dur[00m:[01;34m~/IdeaProjects[00m$ 
]0;thufir@dur: ~/IdeaProjects[01;32mthufir@dur[00m:[01;34m~/IdeaProjects[00m$ exit
exit

Script done on 2017-10-27 06:21:19-0700

O jargão (?) é reflexo, neste caso, gnome-terminal color. Sim, usando um shell diferente, console diferente, etc, é possível não gerar esse "rabisco". A questão é como obter o comando script para não gravá-los, ou obter o utilitário pastebin (ou semelhante, como gist-paste ) para lidar com eles "muito bem".

em primeiro lugar, obrigado pelas respostas. Em segundo lugar, espero que isso não atrapalhe as águas:

thufir@dur:~$ 
thufir@dur:~$ script trying_to_eliminate_control_chars.txt
Script started, file is trying_to_eliminate_control_chars.txt
thufir@dur:~$ 
thufir@dur:~$ echo "hi"
hi
thufir@dur:~$ 
thufir@dur:~$ echo "hi"
hi
thufir@dur:~$ 
thufir@dur:~$ echo "hmm"
hmm
thufir@dur:~$ 
thufir@dur:~$ exit
exit
Script done, file is trying_to_eliminate_control_chars.txt
thufir@dur:~$ 
thufir@dur:~$ cat trying_to_eliminate_control_chars.txt > foo.txt
thufir@dur:~$ 
thufir@dur:~$ cat foo.txt 
Script started on 2017-10-31 17:51:29-0700
thufir@dur:~$ 
thufir@dur:~$ echo "hi"
hi
thufir@dur:~$ 
thufir@dur:~$ echo "hi"
hi
thufir@dur:~$ 
thufir@dur:~$ echo "hmm"
hmm
thufir@dur:~$ 
thufir@dur:~$ exit
exit

Script done on 2017-10-31 17:51:47-0700
thufir@dur:~$ 
thufir@dur:~$ cat trying_to_eliminate_control_chars.txt 
Script started on 2017-10-31 17:51:29-0700
thufir@dur:~$ 
thufir@dur:~$ echo "hi"
hi
thufir@dur:~$ 
thufir@dur:~$ echo "hi"
hi
thufir@dur:~$ 
thufir@dur:~$ echo "hmm"
hmm
thufir@dur:~$ 
thufir@dur:~$ exit
exit

Script done on 2017-10-31 17:51:47-0700
thufir@dur:~$ 
thufir@dur:~$ pastebin foo.txt 
pastebin: command not found
thufir@dur:~$ 
thufir@dur:~$ pastebinit foo.txt 
http://paste.ubuntu.com/25862228/
thufir@dur:~$ 

Enquanto você pode ingenuamente esperar que o acima cole não para ter caracteres de controle, faz . Isso ocorre porque o terminal em si (ou pelo menos eu deduzo) está manipulando / ocultando-os.

Arquivos de texto de muito baixo nível, etc., em reprodução. Mais conhecimento detalhado de como funciona a emulação de terminal. Um pouco além de mim, francamente.

    
por Thufir 27.10.2017 / 15:31

2 respostas

2

Eu testei toda a solução, fornecida nas referências abaixo, para processar e limpar o arquivo de saída do comando script de caracteres especiais.

No meu Ubuntu 16.04, apenas a seguinte solução fornece um resultado satisfatório:

perl -pe 's/\e([^\[\]]|\[.*?[a-zA-Z]|\].*?\a)//g' typescript | col -b > typescript.new

Ou você pode canalizar a saída diretamente para o programa cliente de upload:

perl -pe 's/\e([^\[\]]|\[.*?[a-zA-Z]|\].*?\a)//g' typescript | col -b | pastebinit

O comando acima funciona com pastebinit , então instale-o:

sudo apt install pastebinit

Referências:

Criar um comando personalizado 'script para pastebin' - spaste

Sugiro criar um comando personalizado, com base na solução acima. Vamos citar spaste .

1. Crie um arquivo de script executável chamado spaste , localizado em /usr/local/bin para ser acessível como comando shell:

sudo touch /usr/local/bin/spaste
sudo chmod +x /usr/local/bin/spaste
sudo nano /usr/local/bin/spaste
  • Copie o script abaixo. E em nano : colar Shift Ins ; save Ctrl O Enter ; sair Ctrl X .
#!/bin/bash
# Name: spaste
# Location: /usr/local/bin
#export LC_ALL=C

# If the first input parameter is option - see: script --help; or type 'script --help'
[[ "" =~ -.* ]] && TARGET_FILE="" || TARGET_FILE=""

# If the variable $TARGET_FILE is empty, use the default output file name
[[ -z "${TARGET_FILE}" ]] && TARGET_FILE="typescript"

# The main function - Remove color codes, etc.
script_remove_extras() {
        script "$@"
        perl -pe 's/\e([^\[\]]|\[.*?[a-zA-Z]|\].*?\a)//g' "$TARGET_FILE" | col -b > "/tmp/$USER-cpaste-$TARGET_FILE.tmp"
        cp "/tmp/$USER-cpaste-$TARGET_FILE.tmp" "$TARGET_FILE"
}

# Upload to 'pastebinit'
upload_pastebinit() { pastebinit < "$TARGET_FILE"; }

# GUI mode with 'chromium' or 'firefox'; CLI mode with 'lynx'; Just upload with 'pastebinit'; Just clear the outputfile
if   [ "$SPASTE_MODE" == "chromium" ]; then
        script_remove_extras "$@"; nohup chromium-browser "$(upload_pastebinit)" >/dev/null 2>&1 &
elif [ "$SPASTE_MODE" == "firefox" ]; then
        script_remove_extras "$@"; nohup firefox "$(upload_pastebinit)" >/dev/null 2>&1 &
elif [ "$SPASTE_MODE" == "lynx" ]; then
        script_remove_extras "$@"; lynx "$(upload_pastebinit)"
elif [ "$SPASTE_MODE" == "upload" ]; then
        script_remove_extras "$@"; upload_pastebinit
else
        script_remove_extras "$@"
fi

2. Explicação:

  • Quando você executar o novo comando spaste , ele chamará o comando script e atribuirá a ele os parâmetros de entrada do usuário. Portanto, a sintaxe da chamada é igual ao comando script - consulte script --help ou digite spaste --help para obter mais detalhes:

    Usage:
     spaste (script) [options] [file]
    
    Make a typescript of a terminal session.
    
    Options:
     -a, --append            append the output
     -c, --command <command> run command rather than interactive shell
     -e, --return            return exit code of the child process
     -f, --flush             run flush after each write
         --force             use output file even when it is a link
     -q, --quiet             be quiet
     -t, --timing[=<file>]   output timing data to stderr (or to FILE)
     -V, --version           output version information and exit
     -h, --help              display this help and exit
    
  • Quando você digitar exit para sair da sessão do comando script , spaste processará o arquivo de saída de script com o comando pastebinit .

  • Em resultado, pastebinit retornará um link para o conteúdo carregado do arquivo de saída de script .

  • O novo comando spaste tem poucos modos diferentes de como lidar com o link retornado por pastebinit . Esses modos podem ser alternados exportando a variável $SPASTE_MODE com valores diferentes antes da execução do comando spaste :

    $ export SPASTE_MODE=
    $ spaste
    
  • Os modos disponíveis são:

    • SPASTE_MODE=chromium - abrirá o link retornado no Chromium.
    • SPASTE_MODE=firefox - abrirá o link retornado no FireFox.
    • SPASTE_MODE=lynx - abrirá o link retornado Lynx (navegador do terminal).
    • SPASTE_MODE=upload - apenas produzirá o link retornado.
    • SPASTE_MODE= - não retornará um link; apenas processará o conteúdo do arquivo de saída.
  • Você pode exportar o seu modo favorito do arquivo ~/.bashrc , por exemplo, adicionar ao final a seguinte linha:

    export SPASTE_MODE=firefox
    

3. Demonstração de uso:

    
por pa4080 31.10.2017 / 07:36
1

Eu não acho que essa é a resposta que você está procurando, mas funciona:

Depois de executar script e criar um arquivo typescript , execute cat typescript . Todas as seqüências de escape são consumidas pelo terminal, portanto, a saída é texto plano colorido. Copie-o manualmente (usando o mouse) e ele salvará na área de transferência como texto simples. Cole onde for necessário.

    
por wjandrea 27.10.2017 / 23:50