有没有办法知道脚本脚本命令是否正在当前的bash会话中运行?

时间:2020-01-09 19:32:53

标签: bash shell zsh zshrc

我正在尝试将一个命令添加到我的~/.zshrc文件中,以记录命令行的输入和输出。我有需要运行的scripthttps://www.tecmint.com/record-and-replay-linux-terminal-session-commands-using-script/)命令,但是似乎有无限的尝试记录我的会话的问题。我认为这是由于以下事实:当您运行script命令时,它会启动一个新的bash会话,而该会话又会运行~/.zshrc,然后它会尝试记录该会话,从而重新启动该会话(等等)。 )。这导致它陷入尝试记录会话的无限循环。

尝试1 我的~/.zshrc

的相关部分
# RECORD COMMAND INPUT AND OUTPUT
LOG_PATH=/var/log/terminal/$(date +'%Y%m%d')
LOG_FILE=${LOG_PATH}/$(date +'%H%M%S').log
mkdir -p ${LOG_PATH}
script ${LOG_FILE}

这将导致一个会话,该会话不断打印以下内容:

Script started, output file is /var/log/terminal/20200109/141849.log
Script started, output file is /var/log/terminal/20200109/141850.log
Script started, output file is /var/log/terminal/20200109/141851.log
Script started, output file is /var/log/terminal/20200109/141852.log
Script started, output file is /var/log/terminal/20200109/141853.log
Script started, output file is /var/log/terminal/20200109/141854.log
Script started, output file is /var/log/terminal/20200109/141855.log
... repeat infinitely ...

尝试2 解决此问题的一种尝试是检查文件是否已经存在,然后继续进行记录(该方法有些奏效,但有时会创建2个文件,或者有时如果我连续快速打开2个命令会话,则记录无法开始)。

升级的脚本

# RECORD COMMAND INPUT AND OUTPUT
# Check if the recording of a file for the given time has already started
# as it seems that once you start the script recording it re-starts the session
# which in turn re-runs this file which attempts to script again running into an infinite loop

LOG_PATH=/var/log/terminal/$(date +'%Y%m%d')
LOG_FILE=${LOG_PATH}/$(date +'%H%M%S').log
if [[ ! -f $LOG_FILE ]]; then
        mkdir -p ${LOG_PATH}
        script ${LOG_FILE}
fi

同样,它要么不产生记录(在快速打开2个会话的情况下),要么导致记录进行两次

Script started, output file is /var/log/terminal/20200109/141903.log
Script started, output file is /var/log/terminal/20200109/141904.log

尝试3 另一尝试是检查bash历史记录,并查看最后一个命令是否包含单词script。这次尝试的问题是,bash会话在启动时似乎没有历史记录,因此出现以下错误(然后像第一次尝试一样无限尝试启动记录会话):

# RECORD COMMAND INPUT AND OUTPUT
# Check what the last command was to make sure that it wasn't the script starting
# as it seems that once you start the script recording it re-starts the session
# which in turn re-runs this file which attempts to script again running into an infinite loop

LAST_HISTORY=$(history -1)
if [[ "$LAST_HISTORY" != *"script"* ]]; then
        LOG_PATH=/var/log/terminal/$(date +'%Y%m%d')
        LOG_FILE=${LOG_PATH}/$(date +'%H%M%S').log
        mkdir -p ${LOG_PATH}
        script ${LOG_FILE}
fi

输出

Last login: Thu Jan  9 14:27:30 on ttys009
Script started, output file is /var/log/terminal/20200109/142754.log
Script started, output file is /var/log/terminal/20200109/142755.log
omz_history:fc:13: no such event: 0
omz_history:fc:13: no events in that range
Script started, output file is /var/log/terminal/20200109/142755.log
omz_history:fc:13: no such event: 0
omz_history:fc:13: no events in that range
Script started, output file is /var/log/terminal/20200109/142755.log
Script started, output file is /var/log/terminal/20200109/142756.log
^C%                                                                                                                                                                    danielcarmo@Daniels-MacBook-Pro-2 git %

对此表示任何建议或想法。

2 个答案:

答案 0 :(得分:2)

script将变量SCRIPT添加到它运行的命令的环境中。您可以检查以确定是否需要运行script

# RECORD COMMAND INPUT AND OUTPUT
log_path=/var/log/terminal/$(date +'%Y%m%d')
log_file=${log_path}/$(date +'%H%M%S').log
mkdir -p "${log_path}"
[ -z "$SCRIPT" ] && script "${log_file}"

SCRIPT的值是要登录的文件的名称。

答案 1 :(得分:1)

与其试图找出script是否正在运行,不如为自己留一个面包屑:

if [ -z "$BEING_LOGGED" ]
then
  export BEING_LOGGED="yes"
  LOG_PATH="/var/log/terminal/$(date +'%Y%m%d')"
  LOG_FILE="${LOG_PATH}/$(date +'%H%M%S').log"
  mkdir -p "${LOG_PATH}"
  exec script "${LOG_FILE}"
fi

首次获取文件时,将BEING_LOGGED取消设置。调用script并再次获取文件时,将对其进行设置,并且可以跳过日志记录。

相关问题