如何知道您是否在打字稿中?


11

我正在使用script命令将来自终端的所有输出保存到名为的文件中typescript。或script foo保存到文件中foo

现在,假设我正在逐个命令地键入命令,而忘记了我是否在打字稿中。

如何确定我是否在打字稿中?

Answers:


7

也许与:

if lsof -tac script "$(tty)" > /dev/null; then
  echo "I'm running under script"
else
  echo "I'm not"
fi

您可以添加如下内容:

lsof -tac script "$(tty)" > /dev/null && PS1="[script] $PS1"

对于您~/.zshrc~/.bashrc,您可以在scriptshell提示中看到有关您是否在的信息。

另外,如果您不能保证lsof可以安装,则可以这样做(假设未修改的IFS):

terminal=$(ps -o comm= -p $(ps -o ppid= -p $(ps -o sid= -p "$$")))
[ "$terminal" = script ] && PS1="[script] $PS1"

启发式是让会议领导的父的命令名称通常是终端仿真程序(xtermscriptscreen...)。


1
@teikakazura,启发式部分是因为您不能保证它将成为会话负责人的父进程。在这里,与pid重用无关,因为会话领导者及其父代通常在您运行该命令时仍然存在。您可以说第一个是启发式的,我们只是在检查流程名称。任何名称也script为tty并且已打开tty的命令也会导致误报。
斯特凡Chazelas

1
@teikakazura关于(2),它将检查当前shell的ppid。在这里,您要检查会话负责人的ppid(通常是script启动的shell )。
斯特凡Chazelas

我无法理解@StephaneChazelas在这里评论(什么是“(2)”,可能已删除注释),但答案的第二部分是非常有趣的,因为它不仅能够检测script,还包括其他的情况,比如su -lssh,Linux控制台和也许其他人,并提供(通过其他论据ps)更多信息。
斯蒂芬·古里康

5

有趣的问题。我发现一个小的bash脚本可以相当可靠地完成这项工作:

#!/bin/bash

PP=$(ps -o ppid= $$)

while [[ $PP != 1 ]]
do
    LINE=$(ps -o ppid= -o comm= $PP | sed 's/^  *//')
    COMM=${LINE#* }
    PP=${LINE%% *}
    if [[ $COMM == script ]]  # Might need a different comparison
    then
        echo "In script"
        exit 0
    fi
done
echo "Not in script"

我认为这与Stephane Chazelas提出的建议略有不同,因为我的脚本一直沿Linux / Unix进程具有的parent:child关系发展,直到找到PID 1或找到“ script”作为进程为止。


4
有趣的方法。但是,请注意,例如,如果您是xterm从脚本会话开始的,则该脚本会使该xterm中的shell在脚本下运行。好吧,但是输出不会送到打字稿上。我的方法检查与当前会话关联的终端,因此不会出现该问题。
斯特凡Chazelas

0

如果您的路径中有个人bin /目录(例如/ home / user / bin),请在其中放置一个名为'script'(与二进制文件相同的名称)的shell脚本,其内容如下:

#!/bin/bash
export SCRIPT_RUNNING=1
exec /usr/bin/script # full path to your script(1) binary

现在,在脚本运行中,您可以测试环境变量SCRIPT_RUNNING,并根据其执行任何操作。

编辑:

实际上,有一种简单得多的方法。如下所述,创建三个文件〜/ bin / script,〜/ bin / script-shell和〜/ .scriptrc:

~ > ls ~/bin/script ~/bin/script-shell ~/.scriptrc
-rw-r--r-- 1 roadowl users 23 Oct 18 16:52 /home/roadowl/.scriptrc
-rwx------ 1 roadowl users 49 Oct 18 16:53 /home/roadowl/bin/script
-rwx------ 1 roadowl users 56 Oct 18 16:55 /home/roadowl/bin/script-shell

~/bin > cat script
#!/bin/bash
exec /usr/bin/script -c script-shell

~/bin > cat script-shell
#!/bin/bash
exec /bin/bash --rcfile /home/bjd/.scriptrc

~/bin > cat ~/.scriptrc
export PS1="[script] "

如果您当前的shell是bash,请不要忘记hash -r在创建这些文件后运行,以确保在将“ script”作为命令输入时运行〜/ bin / script(选中which script)。

和以前一样,请注意,PATH必须在〜/ bin之前,此路径才能起作用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.