Pau*_*ce. 23
试试这个:
ps -o stat= -p $PPID
Run Code Online (Sandbox Code Playgroud)
如果结果包含"s"(小写),则它可以从命令行运行,也可以从脚本中反向运行.告诉那两者:
ps -o stat= -p $$
Run Code Online (Sandbox Code Playgroud)
如果没有背景,将包含"+".
这是一张桌子:
Run $$ $PPID
CL S+ Ss
CL& S Ss+
Script S+ S+
Script& S S
Script(&) S Ss
Script&(&) S NULL
Run Code Online (Sandbox Code Playgroud)
其中(&)表示子脚本是背景的,并且&表示运行它的父脚本(即"脚本"所指的)是后台的.CL表示命令行.NULL表示ps输出null并且$PPID为"1".
来自man ps:
s is a session leader
+ is in the foreground process group
Run Code Online (Sandbox Code Playgroud)
应该注意的是,这个答案是基于GNU的ps,但BSD的手册页(包括OS X)表明了类似的功能.GNU ps是一种包含BSD功能的混合体.
我相信你真正想知道的是stdout是否是一个终端.如果是,那么你可以(几乎)安全地假设它是一个交互式会话.请尝试以下代码段:
if [[ -t 1 ]]; then
echo "Terminal"
else
echo "Not-a-terminal"
fi
Run Code Online (Sandbox Code Playgroud)
[[ -t 1 ]]上面的命令检查文件描述符1(即stdout)是否是终端.
编辑:
请注意,如果将输出传输到其他程序,这将指示非终端标准输出.在这种情况下,您可能需要一个更通用的条件,也将检查标准输入(文件描述符0):
[[ -t 0 || -t 1 ]]
Run Code Online (Sandbox Code Playgroud)