Вывести "скрипт" для удобочитаемости вставки

Как вставить вывод из script команда (typcript; "man script"), чтобы она была более читабельной?

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

Тарабарщина (?) Отражает, в данном случае, gnome-terminal цвет. Да, используя другую оболочку, другую консоль и т. Д., Можно не генерировать этот "бред". Вопрос в том, как получить script Команда не записывать их, или получить pastebin утилита (или аналогичная, такая как gist-paste) обращаться с ними "красиво".

во-первых, спасибо за ответы. Во-вторых, я надеюсь, что это не мутит воду:

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:~$ 

Хотя вы можете наивно ожидать, что вышеупомянутая вставка не будет иметь управляющих символов, это так. Это потому, что сам терминал (или я так понимаю) обрабатывает / скрывает их.

Текстовые файлы очень низкого уровня и т. Д. При воспроизведении. Плюс очень подробные знания о том, как работает эмуляция терминала. Честно говоря, немного за мной.

2 ответа

Я протестировал все решения, представленные в ссылках ниже, для обработки и очистки выходного файла команды script из специальных символов.

На моем Ubuntu 16.04 только следующее решение обеспечивает удовлетворительный результат:

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

Или вы можете направить вывод непосредственно в клиентскую программу загрузки:

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

Приведенная выше команда работает с pastebinit, так что установите его:

sudo apt install pastebinit

Рекомендации:


Создайте пользовательскую команду "скрипт для вставки" - spaste

Я бы предложил создать собственную команду, основанную на приведенном выше решении. Давайте назовем это spaste.

1. Создайте исполняемый файл скрипта, который называется spaste находится в /usr/local/bin быть доступным как команда оболочки:

sudo touch /usr/local/bin/spaste
sudo chmod +x /usr/local/bin/spaste
sudo nano /usr/local/bin/spaste
  • Скопируйте скрипт ниже. И в nano: вставить Shift Ins; сохранить Ctrl O Enter; выйти из 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`
[[ "${1}" =~ -.* ]] && TARGET_FILE="$2" || TARGET_FILE="$1"

# 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. Объяснение:

  • Когда вы выполняете новую команду spaste это вызовет команду script и назначит ему входные параметры пользователя. Таким образом, синтаксис вызова такой же, как команда script - увидеть script --help или введите spaste --help Больше подробностей:

    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
    
  • Когда вы печатаете exit выйти из сессии script команда, spaste обработает выходной файл script в команду pastebinit,

  • В результате pastebinit вернет ссылку на загруженный контент script выходной файл.

  • Новая команда spaste имеет несколько различных режимов работы со ссылкой, возвращаемой pastebinit, Эти режимы могут быть переключены путем экспорта переменной $SPASTE_MODE с разными значениями перед выполнением команды spaste:

    $ export SPASTE_MODE=
    $ spaste
    
  • Доступные режимы:

    • SPASTE_MODE=chromium - откроет возвращенную ссылку в Chromium.
    • SPASTE_MODE=firefox - откроет возвращенную ссылку в FireFox.
    • SPASTE_MODE=lynx - откроет возвращенную ссылку Lynx (терминал браузера).
    • SPASTE_MODE=upload - просто выведет возвращенную ссылку.
    • SPASTE_MODE= - не вернет ссылку; просто обработает содержимое выходного файла.
  • Вы можете экспортировать свой любимый режим из ~/.bashrc Например, добавьте в конец файла следующую строку:

    export SPASTE_MODE=firefox
    

3. Демонстрация использования:

Я не думаю, что это ответ, который вы ищете, но он работает:

Как только вы запустите script и он создал typescript файл, запустить cat typescript, Все escape-последовательности потребляются терминалом, поэтому на выходе отображается цветной текст. Скопируйте его вручную (с помощью мыши), и он сохранится в буфер обмена в виде обычного текста. Вставьте, где это необходимо.

Другие вопросы по тегам