我们有一个实现,可以使用自定义命令为特定工具设置环境。
例如: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
)。我不知道这是否是一个好主意,但至少在这样做时你应该非常小心。