bluetoothctl 在哪裡儲存命令歷史記錄?
man bluetoothctl
,info bluetoothctl
和中沒有關於命令歷史的任何內容bluetoothctl --help
。
簡短的回答
bluetoothctl
將命令歷史儲存在~/.cache/.bluetoothctl_history
.長答案
免責聲明:長答案需要對程式語言 C 有所了解。
bluetoothctl
是一個命令行工具,隨BlueZ - Linux 的藍牙協議棧一起提供。如果我們看一下 BlueZ 的原始碼:我們很快就會意識到這
bluetoothctl
是在使用GNU Readline 庫作為它的互動式 shell。根據Readline 的文件,函式write_history
可用於將歷史記錄寫入文件。如果我們只是在 BlueZ 原始碼中 grep 獲取此函式的名稱:$ grep write_history -r src/shared/shell.c: write_history(data.history);
中的命令歷史記錄
bluetoothctl
被寫入一個文件,該文件的名稱保存.history
在struct data
. 然後,只需 grepping 訪問該欄位,我們就會找到它的初始化位置: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 規範。其他環境變數是基本的$HOME
和$PWD
. 欄位data.name
在其他地方設置:void bt_shell_init(int argc, char **argv, const struct bt_shell_opt *opt) { ... data.name = strrchr(argv[0], '/'); ... }
所以
char *name
函式中的變數rl_init_history
將包含字元串bluetoothctl
,執行檔的名稱。請參閱C中的描述argv
。因此,在大多數遵循 freedesktop.org 規範的桌面環境中,命令行工具
bluetoothctl
會將命令的歷史記錄儲存在文件中~/.cache/.bluetoothctl_history
。如果定義了環境變數XDG_CACHE_HOME
,則命令歷史記錄將儲存在$XDG_CACHE_HOME/.bluetoothctl_history
.