@user310685 почти понял -, но ОПРЕДЕЛЕННО НЕПРАВИЛЬНО. Это исправление «работает» только тогда, когда xdg-open
является НЕ заданным «голым» путям к файлам (, то есть без начального «файла ://» схемы URI и двойной -косой черты )или файл -спланированный URI (, то есть с начальным «файл ://» ). Эти два типа аргументов должны иметь xdg-open
отсрочку до pcmanfm
, но они этого не сделают.
Фактическая ошибка не является ошибкой перенаправления STDERR. Скорее, сценарист перепутал test
оператор «и» и соединитель «и» в списке процессов оболочки. Один (ошибочно )используется как «-a»; правильный "&&".
В качестве справки я воспроизвел исходную строку сценария, мое исправление для этой строки и предложение «ужас из ужасов» от @user310685:
#ORIG# if pcmanfm --help >/dev/null 2>&1 -a is_file_url_or_path "$1"; then
#FIXED# if pcmanfm --help >/dev/null 2>&1 && is_file_url_or_path "$1"; then
#HORROR# if pcmanfm --help >/dev/null 2>$1 -a is_file_url_or_path "$1"; then
Цель if..; then
указана в строке скрипта чуть выше:
# pcmanfm only knows how to handle file:// urls and filepaths, it seems.
Имея в виду этот комментарий, способ понять проблемную строку if.. then
таков::
pcmanfm
(, сообщив о собственной справке и отбросив все STDOUT или STDERR)is_file_url_or_path()
, чтобы затем проверить, является ли аргумент "$1"
приемлемым дляpcmanfm
(в соответствии с приведенным выше комментарием к коду )Если выполняются оба этих условия,затем сценарий переходит в короткий блок, который:
file_url_to_path()
, чтобы удалить любую начальную часть «файла ://» (как локальную переменнуюfile
)file
pcmanfm "$file"
Почему исходный сценарий не работает:
Как отмечалось выше, сценарий (ошибочно )использует «-a» в качестве «списка процессов и оператора». Что на самом деле происходит, так это то, что оболочка запускает команду (после того, как перенаправления STDOUT и STDERR «извлекаются» из команды, которым разрешено находиться в любом месте последовательности командных слов после первого слова ):
.
pcmanfm --help -a is_file_url_or_path "$1"
Этот всегда завершается успешно (, если только pcmanfm
не является исполняемым в PATH ). Все лишнее в командной строке(-a..
)игнорируется pcmanfm
, работающим в режиме --help
. Таким образом, кодовый блок «процесс как файл или файл -URL» всегда выполняется. При задании URL-адреса (с частью схемы )функция file_url_to_path()
скрипта -удаляет только начальный «файл ://», обрезает любой завершающий фрагмент «#...", а также URI -декодирует аргумент (, т.е. "%XX" преобразуется в ASCII ). ПРИМЕЧАНИЕ. :Если аргумент не начинается с «file :///», ничего не делается.
Например, URL-адрес OP «https://www.google.com» не меняется на file_url_to_path()
, поскольку он не начинается с «файл :///».НОболее поздний код считает этот аргумент «относительным путем», поскольку он явно не начинается с «/». Таким образом, он добавляет CWD в начало, как описано, а затем pcmanfm
почти наверняка НЕ найдет это удаленное значение как существующий путь для отображения. Вместо этого он показывает всплывающее сообщение об ошибке -, как и в вопросе ОП.
Исправление:
Достаточно просто :используйте правильный синтаксис для цепочки процессов И -оператор :"&&", как показано в строке #FIXED#
выше.
УЖАС от предложения @user310685:
То, что предлагает @user310685, вроде как решает одну проблему. Что происходит, так это то, что оболочка покорно выполняет расширение переменных, а затем пытается выполнить что-то вроде:
pcmanfm --help >/dev/null 2>https://www.google.com -a is_file_url_or_path https://www.google.com
Это почти наверняка приведет к ошибке перенаправления оболочки (, если CWD не имеет папки (в нужном месте )с именем «https :» -, которую он мог ). Эта ошибка перенаправления отправляет сообщение в STDERR, а затем оболочка продолжает работу. Поскольку эта ошибка произошла в блоке if.. else.. fi
, оболочка берет часть else.. fi
, чего хочет @user310685. Таким образом, проблема решена...
НО КАКОЙ ЦЕНОЙ???
Есть две проблемы с этим -не совсем -правильным исправлением:
else.. fi
). Это связано с тем, что предполагаемая цепочка процессов на самом деле представляет собой всего один процесс, который (почти )всегда генерирует ошибку перенаправления оболочки, которая воспринимается как условие if.. ;
как «ложное». Это не так уж плохо, так как этот else.. fi
блок просто откладывает работу на другую функцию скрипта -с именем open_generic()
, которая предназначена для обработки путей и файлов -URL-адресов (, но не использует pcmanfm
для выполнения работы, а какой-то другой сложный код -путь, который я не анализировал, но, как я полагаю, выполняет честную работу ). Но ПОДОЖДИТЕ! УЖАС... pcmanfm --help...
расширенную строку скрипта, которую пытается выполнить оболочка. Обратите внимание на перенаправление STDERR. Подумайте, что произойдет, если это будет сделано с допустимым путем, например «/home/user/precious». OMGПопытка проверить, доступен ли pcmanfm
, а затем проверить, является ли аргумент файлом, простоПЕРЕЗАПИСАЛ ФАЙЛ!!!Пока -пока дорогая... Если вы установили пакет с помощью sudo apt install signal-desktop
в соответствии с инструкциями на странице загрузки signal.org, тогда должен быть другой (системный -широкоформатный )файл рабочего стола по адресу /usr/share/applications/signal-desktop.desktop
.
Если щелкнуть правой кнопкой мыши -пункт меню Signal (env)
, предложит ли он какой-либо параметр «свойства» или что-то подобное? Это может рассказать вам больше о том, где он живет.
Похоже, что в Cinnamon есть специальный редактор меню, доступ к которому можно получить, -щелкнув правой кнопкой мыши значок Mint в нижнем -левом углу, выбрав Configure...
,затем выберите вкладку «Меню» и нажмите Open the menu editor
.