Command-History

bluetoothctl 在哪裡儲存命令歷史記錄?

  • January 28, 2021

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被寫入一個文件,該文件的名稱保存.historystruct 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.

引用自:https://unix.stackexchange.com/questions/631146