是否可以查明我们的命令是来自脚本还是在命令行上手动键入?

是否可以查明我们的命令是来自脚本还是在命令行上手动键入?

我们有一个实现,可以使用自定义命令为特定工具设置环境。

例如:custom_command tool_name

此命令将调用时间、用户和工具名称记录在日志文件中。

通过这些日志,我们可以找出上次使用特定工具的时间。

现在,用户已经习惯将命令放入其登录配置文件中。

那么,是否可以查明 comamnd 是否是通过在命令行上手动键入来调用的,或者是来自另一个脚本,如果是,脚本名称是什么?

我尝试了多种方法。我所能找到的只是父脚本名称,即 shell。

我的理解是这是不可能的。但我只是想试试运气。

答案1

bash脚本中我通常这样做:

#!/bin/bash

if test "$0" != "$BASH_SOURCE"; then
    SOURCED=1
    MY_NAME=$BASH_SOURCE
else
    SOURCED=0
    MY_NAME=$0
fi

# do something here

if test "$SOURCED" = "1"; then
    # use return instead of exit
    return
fi

# do something here only when not sourced
exit

答案2

我不认为这是完全可能的。

当然,您可以找出父进程是什么以及它的命令行参数是什么,但是最终在运行交互式 shell 时,从启动脚本执行的程序的父进程与交互式执行的程序相同。

如果它仅在执行的地方,.profile您可以通过之后来源的事实来检测到这一点/etc/bashrc(因为您可以放置​​一个命令来停止忽略来自此 shell 的执行)。

另一种方法可能是检查父进程的启动时间。通常,命令的交互式执行会在 shell 启动后不久执行,而 init 脚本将在 shell 启动后不久执行。

一个更复杂的想法是用一个包装器来替换,/bin/bash该包装器以更定制的方式控制启动文件的来源(这个想法与第一个想法类似,但是要让你的命令运行 .bashrc)。我不知道这是否是一个好主意,但至少在这样做时你应该非常小心。

相关内容