Answers:
也许与:
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
,您可以在script
shell提示中看到有关您是否在的信息。
另外,如果您不能保证lsof
可以安装,则可以这样做(假设未修改的IFS):
terminal=$(ps -o comm= -p $(ps -o ppid= -p $(ps -o sid= -p "$$")))
[ "$terminal" = script ] && PS1="[script] $PS1"
启发式是让会议领导的父的命令名称通常是终端仿真程序(xterm
,script
,screen
...)。
script
启动的shell )。
script
,还包括其他的情况,比如su -l
,ssh
,Linux控制台和也许其他人,并提供(通过其他论据ps
)更多信息。
有趣的问题。我发现一个小的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”作为进程为止。
xterm
从脚本会话开始的,则该脚本会使该xterm中的shell在脚本下运行。好吧,但是输出不会送到打字稿上。我的方法检查与当前会话关联的终端,因此不会出现该问题。
如果您的路径中有个人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之前,此路径才能起作用。
script
为tty并且已打开tty的命令也会导致误报。