避免在存储命令和函数输出的脚本上捕获输入

问题描述

我有一个脚本,用于在日志文件中存储命令、函数和其他脚本的输出

我想避免捕获用户输入。

负责将命令的输出存储到日志文件的行是这样的:

$command 2>&1 | tee /dev/tty | ruby -pe 'print Time.Now.strftime("[%s] ") if !$stdin.tty?' >> "$tempfile"

如果命令是要求用户输入并打印出这些数据的函数或脚本,则该输入将存储在临时文件中。我想避免这种情况,因为我不想捕获合理的数据。

我无法修改我正在包装的命令和函数

解决方法

您的命令只保存程序输出,不保存用户输入。您看到的问题是该命令选择输出用户输入的任何内容,将其合并到自己的输出中,然后显然会记录。

没有好的方法可以解决这个问题。请修复您的命令。

无论如何。这是一个糟糕的、脆弱的、hacky 的方法:

tempfile=test.txt
command='read -ep Enter_some_input: '

$command 2>&1 | 
  tee /dev/tty | 
  python3 -c $'import os\nwhile s:=os.read(0,1024):\n if len(s) > 3: os.write(1,s)' |
  ruby -pe 'print Time.now.strftime("[%s] ") if !$stdin.tty?' >> "$tempfile"

Python 命令删除 3 个字节或更少的所有读取。这旨在逐个字符地删除回显,就像在用户输入 readline 和类似内容的最基本情况下会发生的那样,同时希望不会删除太多有意输出。