输出“脚本”到 pastebin 可读性

输出“脚本”到 pastebin 可读性

我如何粘贴来自命令(typescript;“man script”)的输出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颜色。是的,通过使用不同的 shell、不同的控制台等,可以不生成这种“乱码”。问题是如何巧妙地让命令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:~$ 

虽然你可能天真地期望多于粘贴不是要有控制字符,它。这是因为终端本身(或者我推断)正在处理/隐藏它们。

非常低级的文本文件等在起作用。此外还有关于终端仿真如何工作的非常详细的知识。坦率地说,这有点超出我的理解范围。

答案1

我已经测试了下面参考资料中提供的所有解决方案,以处理和清理命令的输出文件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

参考:


创建“脚本到 pastebin”自定义命令 - spaste

我建议根据上述解决方案创建一个自定义命令。我们将其命名为斯帕斯特

1.创建可执行脚本文件,名为spaste,位于 ,/usr/local/bin可以作为 shell 命令访问:

sudo touch /usr/local/bin/spaste
sudo chmod +x /usr/local/bin/spaste
sudo nano /usr/local/bin/spaste
  • 复制以下脚本。然后输入nano:粘贴Shift Ins;保存CtrlO Enter;退出CtrlX
#!/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的输出文件。scriptpastebinit

  • 结果将返回到输出文件pastebinit的上传内容的链接。script

  • 新命令spaste有几种不同的模式来处理 返回的链接。 可以在执行命令之前pastebinit通过导出具有不同值的变量来切换这些模式:$SPASTE_MODEspaste

    $ 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.使用演示:

在此处输入图片描述

答案2

我认为这不是您想要的答案,但它确实有效:

运行script并创建typescript文件后,运行cat typescript。所有转义序列都被终端使用,因此输出是彩色纯文本。手动复制(使用鼠标),它将以纯文本形式保存到剪贴板中。粘贴到需要的地方。

相关内容