![bluetoothctl 在哪里存储命令历史记录?](https://linux22.com/image/187026/bluetoothctl%20%E5%9C%A8%E5%93%AA%E9%87%8C%E5%AD%98%E5%82%A8%E5%91%BD%E4%BB%A4%E5%8E%86%E5%8F%B2%E8%AE%B0%E5%BD%95%EF%BC%9F.png)
man bluetoothctl
、info bluetoothctl
和中没有任何关于命令历史记录的内容bluetoothctl --help
。
答案1
简短回答
bluetoothctl
将命令历史记录存储在~/.cache/.bluetoothctl_history
.
长答案
免责声明:长答案需要对编程语言 C 有一定的了解。
bluetoothctl
是一个命令行工具,附带BlueZ – 适用于 Linux 的蓝牙协议栈。如果我们看一下 BlueZ 的源代码:
我们很快就会意识到正在bluetoothctl
使用GNU Readline 库其交互式外壳。每Readline 的文档, 函数write_history
可用于将历史记录写入文件。如果我们只是在 BlueZ 源代码中 grep 查找该函数的名称:
$ grep write_history -r
src/shared/shell.c: write_history(data.history);
命令的历史记录被写入一个文件中,该文件bluetoothctl
的名称保存在.然后,只需 grep 访问该字段,我们就会找到它的初始化位置:.history
struct data
static void rl_init_history(void)
{
const char *name;
char *dir;
memset(data.history, 0, sizeof(data.history));
name = strrchr(data.name, '/');
if (!name)
name = data.name;
else
name++;
dir = getenv("XDG_CACHE_HOME");
if (dir) {
snprintf(data.history, sizeof(data.history), "%s/.%s_history",
dir, name);
goto done;
}
dir = getenv("HOME");
if (dir) {
snprintf(data.history, sizeof(data.history),
"%s/.cache/.%s_history", dir, name);
goto done;
}
dir = getenv("PWD");
if (dir) {
snprintf(data.history, sizeof(data.history), "%s/.%s_history",
dir, name);
goto done;
}
return;
done:
read_history(data.history);
using_history();
bt_shell_set_env("HISTORY", data.history);
}
这里,XDG_CACHE_HOME
来自freedesktop.org 规范。其他环境变量是 basic$HOME
和$PWD
.字段data.name
设置在其他地方:
void bt_shell_init(int argc, char **argv, const struct bt_shell_opt *opt)
{
...
data.name = strrchr(argv[0], '/');
if (!data.name)
data.name = strdup(argv[0]);
else
data.name = strdup(++data.name);
...
}
因此char *name
函数中的变量将包含可执行文件的名称rl_init_history
字符串。bluetoothctl
看argv
C中的描述。
因此,在大多数遵循 freedesktop.org 规范的桌面环境中,命令行工具bluetoothctl
会将命令的历史记录存储在文件中~/.cache/.bluetoothctl_history
。如果定义了环境变量XDG_CACHE_HOME
,则命令的历史记录将存储在$XDG_CACHE_HOME/.bluetoothctl_history
.