如何判断用户是否select了“terminal运行”

当你双击一个bash脚本的时候,Ubuntu会询问用户是否想要显示,运行或者在terminal里运行…

脚本中是否有方法来确定用户是否select“运行在terminal”?

严格来说,在点击脚本之后,你不能分辨出用户是否选择了“Run In Terminal”,或者启动了终端并从那里运行脚本。 但是下面的命令可以帮助你,特别是[ -t 2 ]

 if [ -t 1 ]; then echo "Standard output is a terminal." echo "This means a terminal is available, and the user did not redirect the script's output." fi 
 if [ -t 2 ]; then echo "Standard error is a terminal." >&2 echo "If you're going to display things for the user's attention, standard error is normally the way to go." >&2 fi 
 if tty >/dev/null; then echo "Standard input is a terminal." >$(tty) echo "The tty command returns the name of the terminal device." >$(tty) fi 
 echo "This message is going to the terminal if there is one." >/dev/tty echo "/dev/tty is a sort of alias for the active terminal." >/dev/tty if [ $? -ne 0 ]; then : # Well, there wasn't one. fi 
 if [ -n "$DISPLAY" ]; then xmessage "A GUI is available." fi 

这里是一个例子:

 #!/bin/bash GRAND_PARENT_PID=$(ps -ef | awk '{ print $2 " " $3 " " $8 }' | \ grep -P "^$PPID " | awk '{ print $2 }') GRAND_PARENT_NAME=$(ps -ef | awk '{ print $2 " " $3 " " $8 }' \ | grep -P "^$GRAND_PARENT_PID " | awk '{ print $3 }') case "$GRAND_PARENT_NAME" in gnome-terminal) echo "I was invoked by gnome-terminal" ;; xterm) echo "I was invoked by xterm" ;; *) echo "I was invoked by someone else" esac 

现在,让我更详细地解释一下。 在脚本被终端执行的情况下,其父进程总是一个shell本身。 这是因为终端模拟器运行shell来调用脚本。 所以这个想法是看看祖父母的过程。 如果祖父母进程是一个终端,那么你可以认为你的脚本是从终端调用的。 否则,它会被别的东西调用,例如Nautilus,它是Ubuntu默认的文件浏览器。

以下命令给你一个父进程ID。

 ps -ef | awk '{ print $2 " " $3 " " $8 }' | grep -P "^$PPID " | awk '{ print $2 }' 

这个命令给你一个你父母的父进程的名字。

 ps -ef | awk '{ print $2 " " $3 " " $8 }' | grep -P "^$GRAND_PARENT_PID " | awk '{ print $3 }' 

最后的switch语句只是比较祖父进程名称和一些已知的终端仿真器。

从来没有尝试过,但可能这个工程:

 if [ -t 1 ] ; 

虽然如果输出它也是错误的…