View Issue Details

IDProjectCategoryView StatusLast Update
0003345Far ManagerCommand Line/Executepublic2016-11-11 11:55
Reporterheilong Assigned To 
PrioritynormalSeverityminorReproducibilityalways
Status newResolutionopen 
Product Version3.0 
Summary0003345: При запуске xxx фар пытается выполнить файл xxx, тогда как имеется xxx.exe
DescriptionСтоит у меня `C:\Program Files\nodejs\node.exe`. Путь добавлен в Path.
Пишу на командной строке `node` - запускается.

В cygwin-е у меня есть некоторый скрипт на node, которые вызывается из-под cron-а. У cron-а свой path, ограниченный cygwin-скими директориями.
Так что я взял и создал symlink `C:/cygwin/usr/local/bin/node` -> ``C:\Program Files\nodejs\node.exe`

Стало быть, cron скрипт заработал.
Но теперь я пишу в фаре `node`, и получаю

C:\ # node
'"C:\cygwin\usr\local\bin\node"' is not recognized as an internal or external command,
operable program or batch file.

Надо заметить, что `C:\cygwin\usr\local\bin` в Path у меня первее, чем путь к nodejs. Но с чего Far-у пробовать запускать `node` без .exe? Он же не знает, как его запускать? Понятное дело, Винда не знает, как запускать файл без расширения. Зачем пытаться?

Заметил я эту проблему только сейчас (3.0.0.4833), по-моему раньше её не было. Но не берусь утверждать, т.к. редко запускаю node из Фара.
TagsNo tags attached.
Build

Activities

DrKnS

2016-11-09 19:25

administrator   bugnote:0014979

Start - Run - node что говорит?

heilong

2016-11-09 19:28

reporter   bugnote:0014980

Успешно запускает `C:\Program Files\nodejs\node.exe`

DrKnS

2016-11-09 19:31

administrator   bugnote:0014981

А C:\cygwin\usr\local\bin в глобальном path или только для Far?

heilong

2016-11-09 20:12

reporter   bugnote:0014983

В глобальном path.
Win+R > cmd
node - запускается
C:\>C:\cygwin\usr\local\bin\node
'C:\cygwin\usr\local\bin\node' is not recognized as an internal or external command, operable program or batch file.

DrKnS

2016-11-09 20:47

administrator   bugnote:0014984

> Win+R > cmd

Я спрашивал про случай без cmd, т. е. node прямо там в диалоге.

Экспериментирую у себя, если из WinR запускать без расширения и в path находится сначала файл без расширения - берётся он. Фар ведёт себя так же.

heilong

2016-11-09 22:37

reporter   bugnote:0014985

Да я оба случая проверял.
Щас ещё попробовал всякое разное.
Результаты такие
C:\Windows\System32\nodetest1 -> C:\Program Files\nodejs\node.exe (SYMLINK)
C:\cygwin\usr\local\bin\nodetest2 -> C:\Program Files\nodejs\node.exe (SYMLINK)

Win+R > nodetest1: Показывается диалог "Open with"
Win+R > nodetest2: Запускается C:\Program Files\nodejs\node.exe - волшебство Cygwin-овской магической директории?

Win+R > cmd: nodetest1/nodetest2: ... is not recognized ...
Far: тоже, что и cmd

В общем, Фар ведёт себя так же, как и Винда. Не хуже. Но может ведь лучше? Есть ли какой-то смысл пытаться запускать файл без расширения? Я понимаю, если б юзер сказал конкретно ./noext-file или C:\path\to\noext-file, но найти данный файл в Path и пробовать его запускать это по-моему бессмысленно. Имхо, может запуск файлов без расширения заблокировать (или делать только при указании полного пути)?

Ещё лучше б конечно поддержку shebang добавить, правда всё равно ведь Фар не поймёт, что такое /bin/sh и где его искать. Вообще меня всегда очень печалило, что в Винде нельзя назначить какой-то единый обработчик для файлов без расширения. Если б это было возможно, давно уже кто-нибудь написал бы какой-нибудь скрипт, который бы мог запускать sh/perl/python/awk/... скрипты без расширения (в Cygwin-е скажем полно sh скриптов без расширения). Но вот я подумал - в Винде нет такой фичи, но ведь в Фар можно добавить.

JohnDoe

2016-11-11 10:15

updater   bugnote:0014986

Так что я взял и создал symlink `C:/cygwin/usr/local/bin/node` -> ``C:\Program Files\nodejs\node.exe`

heilong
Почему не создать там полноценный windows-симлинк "node.exe"?

heilong

2016-11-11 11:55

reporter   bugnote:0014989

Да можно и так сделать. Но неаккуратненько как-то :)
Для винды уже есть оригинальный node.exe. А чисто для Cygwin-а .exe добавлять вроде как лишнее (хоть он его и переварит).
По-любому, этот багрепорт не о node или как решить конкретную легко решаемую разными обходными путями проблемку.

Именно предлагаю рассмотреть общий случай попытки direct run-а файла без расширения.
Не заведомо ли тщетна такая попытка вообще? Да, винда предлагает (единоразово) диалог, что делать с этим файлом. Допустим, можно выбрать notepad и просмотреть файл. Не очень-то это и удобно. Есть какая-то иная польза от этого?

Вообще, когда команда some_file ищется по Path&PathExt, предположим, где-то в пути нашёлся файл some_file без расширения. Вижу два реалистичных варианта, что это за файл:

1) Некий sh/py/pl/awk/sed/... скрипт без расширения (допустим, изначально скрипт под UNIX, где такое - не редкость, но т.к. написан на кроссплатформенном скрипт-языке, может работать и под Виндой, либо под Cygwin-ом). Хорошо бы это понять и выполнить его.

2) Просто какой-то файл без расширения, случайно оказавшийся с таким именем.

Если не через direct run, то:

1) Ничего не делать, не считать этот файл как исполняемый вариант. Тогда поиск по Path&PathExt продолжится дальше - глядишь, чего-нибудь более удобоваримое найдётся. Если ничего так и не находится - ошибка "команда не найдена", как обычно. Это самый простой и надёжный вариант, по-моему.

2) Запускать команду через ComSpec. В случае с (cygwin && (comspec == bash)) это прокатит, и если файл - скрипт с shebang-ом, то он выполнится. Но если это левый файл без расширения, то Cygwin с ним также ничего не поделает. Тогда как где-то в другом пути из Path есть реально исполняемый файл с таким именем. Некая доп. фича, полезная только bash-любителям вроде меня (есть ли ещё такие?), в ущерб надёжности.
2a) Фар может проверить - если файл текстовый, и присутствует shebang, запускать через внешнией обработчик, заданный в far:config. Скажем юзер может использовать стандартный ComSpec для работы в Фаре, но тем не менее иметь установленный cygwin/msys/git for windows, и желать, чтоб sh/bash/... из их состава исполнял скрипты без расширения.

3) Самый мощный вариант - и больше всего работы - список типов файлов (интерфейс примерно как сейчас Files highlighting) - каждый паттерн позволяет задать регэксп по файлу, и обработчик для данного типа файла.
К примеру, item в данном списке: regexp "^#/bin/awk\n" (если регэксп по всему файлу, а не построчно) - action "C:\path\to\awk.exe -f !.!" (или может `!`).
Полагаю, работы немало, и вряд ли это много кому нужно...

Мне нравятся варианты 1 и 2а. В идеале оба варианта поддерживаются - если внешний обработчик в far:config задан, юзать вариант 2а, если не задан (дефолт) - юзать вариант 1.

Issue History

Date Modified Username Field Change
2016-11-09 17:33 heilong New Issue
2016-11-09 19:25 DrKnS Note Added: 0014979
2016-11-09 19:28 heilong Note Added: 0014980
2016-11-09 19:31 DrKnS Note Added: 0014981
2016-11-09 20:12 heilong Note Added: 0014983
2016-11-09 20:47 DrKnS Note Added: 0014984
2016-11-09 22:37 heilong Note Added: 0014985
2016-11-11 10:15 JohnDoe Note Added: 0014986
2016-11-11 11:55 heilong Note Added: 0014989