Команда pkexec
используется в графическом интерфейсе для открытия файла, в который обычно может записывать только root. Например, если вы хотите использовать gedit
для открытия файла, вы должны использовать для него pkexec
.
Однако ваша вставка ошибки, которую вы пытались открыть с помощью pkexec
, показывает, что вы, скорее всего, не находитесь в графическом интерфейсе, поскольку переменная $DISPLAY
пуста (согласно этому сообщению):
Gtk-WARNING **: 20:18:25.529: cannot open display:
Возможно, вы находитесь в графическом интерфейсе, но каким-то образом потеряли настройку $DISPLAY
. Например, если вы подключены по ssh к другому компьютеру, вам нужно использовать параметры пересылки X11 ssh(-X
или, возможно, -Y
), чтобы перенаправить отображение графического интерфейса, чтобы клиенты на этом компьютере могли отображать на вашем.
Если вы не возражаете против использования текстового редактора терминала, такого как nano
, просто используйте sudo
напрямую:
$ sudo nano /usr/share/applications/xampp-control-panel.desktop
Или,еще лучше, используйтеsudoedit
(или эквивалентsudo -e
)с путем к файлу, который вы хотите отредактировать, если вы правильно настроили свой редактор, и в этом случае sudo
создаст копию файла, которую вы можете редактировать, затем откройте свой редактор как непривилегированный пользователь и, наконец, скопируйте измененное содержимое обратно в исходное место, перезаписав файл, который вы хотели изменить.
Аналогично strerror(n)
, есть strsignal(n)
, который дает подробное имя, например, SIGINT -> «Прерывание». Но это не то, чего ты действительно хотел.
Этот ответ на Stackoverflow предлагает sigabbrev_np()
, который должен быть доступен в glibc 2.32 :https://stackoverflow.com/a/68481682/6372809
Аббревиатуры сигналов, а также аббревиатуры номеров ошибок известны препроцессору, поэтому вы можете вручную создать список, как в этом ответе на Code Review:https://codereview.stackexchange.com/a/252825/111089
Немного поработал над кодом, чтобы уменьшить количество повторений с #
оператор препроцессора, эта программа знала бы имена некоторых сигналов по номеру:
#include <signal.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define init_signame(x) [x] = #x
static const char *signames[] = {
init_signame(SIGINT),
init_signame(SIGSTOP),
init_signame(SIGTERM),
init_signame(SIGKILL),
init_signame(SIGHUP),
[0] = ""
};
const char *getsig(int sig) {
if (sig <= 0 || sig >= sizeof(signames) / sizeof(*signames) || !signames[sig])
return "UNKN";
return signames[sig];
}
int main(int argc, char *argv[])
{
int i = 0;
if (argc > 1) {
i = atoi(argv[1]);
}
printf("%d = %s = %s\n", i, getsig(i), strsignal(i));
}
Это дает, например,.:
$./signame2 1
1 = SIGHUP = Hangup
Проблема здесь в том, чтобы вычислить все имена для заполнения таблицы...
Для этого одним из вариантов может быть создание дампа компилятором известных ему определений, например.:
$ gcc -dM -E - <<< '#include <signal.h>' |grep -E '#define SIG[A-Z]+ '
#define SIGBUS 7
#define SIGTTIN 21
#define SIGTTOU 22
...
А затем с помощью скрипта соберите из этого что-нибудь полезное. Просто обратите внимание, что могут быть такие записи, как эти:
#define SIGCLD SIGCHLD
#define SIGRTMAX (__libc_current_sigrtmax ())
И я не уверен, имеют ли сигналы реального времени -индивидуальные определения где-либо, или они просто SIGRTMIN+0
, SIGRTMIN+1
и т. д. до SIGRTMAX
.
Или, по крайней мере, если вы работаете в Linux, проверьте справочную страницу для получения списка сигналов. Числа перемешаны между разными архитектурами, и существуют небольшие различия в существующих сигналах, но вы можете получить список имен оттуда.
Если у вас есть glibc 2.32 или новее, вы можете использоватьsigabbrev_np
:
The sigabbrev_np() function returns the abbreviated name of the signal, sig. For example, given the value SIGINT, it returns the string "INT".
Таким образом, вам просто нужно добавить SIG
, чтобы получить SIGINT
.