Где bluetoothctl хранит историю команд?

С GNU Datamash

datamash -t: -s groupby 1 collapse 2 < file

Если ваши данные уже отсортированы, вы можете опустить -s.


Или использование анонимного массива внутри хеша в Perl:

$ perl -F: -lne '
    push @{ $h{$F[0]} }, $F[1] 
    }{ 
    for $k (sort keys %h) {print "$k:", join ",", @{ $h{$k}} }
' file
1.1.1.1:21,22
2.2.2.2:443
3.3.3.3:80,443

7
26.01.2021, 22:14
1 ответ

Краткий ответ

bluetoothctlсохраняет историю команд в ~/.cache/.bluetoothctl_history.


Длинный ответ

Отказ от ответственности :длинный ответ требует некоторого понимания языка программирования C.

bluetoothctl— это инструмент командной строки, который поставляется с BlueZ — стеком протоколов Bluetooth для Linux . Если мы посмотрим на исходный код BlueZ:

мы быстро поймем, что bluetoothctlиспользует библиотеку GNU Readline для своей интерактивной оболочки. Согласно документации Readline , функция write_historyможет использоваться для записи истории в файл. Если мы просто найдем имя этой функции в исходном коде BlueZ:

$ grep write_history -r
src/shared/shell.c:             write_history(data.history);

История команд в bluetoothctlзаписывается в файл, имя которого хранится в поле .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 . Другие переменные окружения — основные $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, имя исполняемого файла. См. описание argvв C .

Таким образом, в большинстве сред рабочего стола, соответствующих спецификации freedesktop.org, инструмент командной строки bluetoothctlбудет хранить историю команд в файле ~/.cache/.bluetoothctl_history. Если переменная среды XDG_CACHE_HOMEопределена,тогда история команд будет храниться в $XDG_CACHE_HOME/.bluetoothctl_history.

11
18.03.2021, 22:34

Теги

Похожие вопросы