如何检查脚本是通过命令行执行还是双击执行?

tca*_*hin 10 command-line scripts

如何确定脚本是从命令行调用还是通过双击文件管理器 (Nautilis) 调用?

如果是前者,我在脚本完成时仍然有一个命令提示符,但如果它被双击(或通过 .desktop 文件执行),脚本将在一个窗口中执行,然后消失。我希望窗口在命令提示符下保持打开状态。

我认为脚本可以进行此检查,并且不执行任何操作(如果从命令行调用),或者exec如果通过双击或 .desktop 调用,则最后执行 bash。

没有成功使用方法来检查是否交互或 tty。

mur*_*uru 9

您可以检查父进程是否为 shell。例如:

#! /bin/bash

if [[ $(readlink -f /proc/$(ps -o ppid:1= -p $$)/exe) != $(readlink -f "$SHELL") ]]
then 
    echo "Starting the shell..."
    exec "$SHELL"
else
    echo "Not starting a shell."
fi
Run Code Online (Sandbox Code Playgroud)

ps -o ppid:1= -p $$打印ppid当前进程 ( -p $$)的父进程 ( )的 PID 。A readlinkon/proc/<pid>/exe应该打印可执行文件的路径,如果您在 shell 中运行它,它将是 shell,或者其他方式。


另一种可能性是SHLVL变量,其指示如何嵌套的壳实例是当前。如果在 shell 中运行,脚本应该有SHLVL2 个或更多。当通过双击或从桌面启动器运行时,它应该是 1:

#! /bin/bash

if (( SHLVL > 1 ))
then 
    echo "Starting the shell..."
    exec "$SHELL"
else
    echo "Not starting a shell."
fi
Run Code Online (Sandbox Code Playgroud)