当你双击一个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 ] ;
虽然如果输出它也是错误的…