Алиасы doskey при использовании другого ComSpec

Столкнулись с проблемой в использовании Far? Здесь можно получить помощь.
Post Reply
gene.pavlovsky
Posts: 173
Joined: Tue 16 Feb, 2010 17:55
Location: Luxembourg
Has thanked: 13 times
Been thanked: 9 times
Contact:

Алиасы doskey при использовании другого ComSpec

Post by gene.pavlovsky »

У меня в doskey.ini бол-во алиасов - это cd в какие-то часто используемые директории. Не знаю, может кому удобнее через folder history и поиск это делать, или через user menu к примеру, а мне нравится через комстроку, например `klx=cd d:\dropbox\doc\vehicles\motorbike\klx250`. Хочу сменить ComSpec на bash. Переписывать эти cd-алиасы в rcfile bash-а бесполезно, ведь cd фар сам должен делать. Так что возможность эта насовсем теряется, при использовании любого другого ComSpec, чем стандартный.
Может быть это даже баг? Я, если честно, не совсем понимаю, когда у меня на старте фара выполняется doskey /macrofile=/path/to/doskey.ini, то какой шелл это всё дело исполняет, и каким образом алиасы становятся доступны в фаре. И почему они перестают быть доступны при использовании другого ComSpec. Просветите!
Maximus5
Posts: 3295
Joined: Sun 11 Nov, 2007 02:03
Been thanked: 10 times
Contact:

Алиасы doskey при использовании другого ComSpec

Post by Maximus5 »

Doskey просто сохраняет список алиасов для текущего консольного окна.
Фар выполняет «разворачивание» алиасов, когда вы их вводите в ком.строке фара.
При чём тут проблемы с другими комспеками - не понятно
gene.pavlovsky
Posts: 173
Joined: Tue 16 Feb, 2010 17:55
Location: Luxembourg
Has thanked: 13 times
Been thanked: 9 times
Contact:

Алиасы doskey при использовании другого ComSpec

Post by gene.pavlovsky »

Я не оч понимаю, где именно хранятся алиасы. В консольном окне? В фаре? В долгоиграющем cmd, запущенном из-под фара (вряд ли...)?
Проблема такая, при старте фара грузится doskey.ini, в нём например `klx=cd d:\dropbox\doc\vehicles\motorbike\klx250`
ComSpec стоит стандартный.
Пишу на консоли klx, фар переходит в нужную директорию.
Если же сделать
set comspec=c:\usr\bin\bashcmd.sh
И после этого klx, то алиас не разворачивается, а передаётся comspec-у, который о нём не знает, а даже если б знал, проку б не было, он же не может поменять рабочую директорию родителю (фару).
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

Алиасы doskey при использовании другого ComSpec

Post by DrKnS »

gene.pavlovsky wrote: Если же сделать
set comspec=c:\usr\bin\bashcmd.sh
И после этого klx, то алиас не разворачивается, а передаётся comspec-у
Если вы внимательно посмотрите на свой doskey.ini, особенно на его начало, то вам станет понятно, почему так происходит.
gene.pavlovsky
Posts: 173
Joined: Tue 16 Feb, 2010 17:55
Location: Luxembourg
Has thanked: 13 times
Been thanked: 9 times
Contact:

Алиасы doskey при использовании другого ComSpec

Post by gene.pavlovsky »

DrKnS wrote:Если вы внимательно посмотрите на свой doskey.ini, особенно на его начало, то вам станет понятно, почему так происходит.
Я знаю, что там у него в начале, но мне всё равно непонятно, как оно всё работает, где именно хранятся эти алиасы при загрузке, и каким образом фар разворачивает те алиасы, которые `cd ...`, до выполнения команды. Ведь фар не doskey, и не cmd.exe, как он тогда может это делать? И почему это перестаёт работать при прописывании другого ComSpec?

Так, добавил в начале файла следующее

Code: Select all

[bashcmd.sh]
klx=cd d:\dropbox\doc\vehicles\motorbike\klx250
Если я делаю `set comspec=c:\usr\bin\bashcmd.sh` уже после загрузки фара (и соотв-но doskey), то алиас klx магически работает (объясните же всё-таки, как?). Но если запустить консоль с cmd.exe, там сделать `set comspec=c:\usr\bin\bashcmd.sh` и запустить фар, то очевидно команда `doskey /macrofile=...` пытается выполнится уже через новый comspec, и не выходит, klx алиас не работает.
Помимо варианта изменять comspec в самом макросе, который грузит doskey macrofile, что ещё можно сделать?

Ещё замечание, я использую вот этот макрос про алиасы - http://forum.farmanager.com/viewtopic.php?f=60&t=8546
Так вот, алиасы на редактирование и перезагрузку алиасов там генерятся макросом и добавляются динамически.
Чтоб оно работало, надо заменить запуск `doskey` на `doskey /exename=bashcmd.sh`
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

Алиасы doskey при использовании другого ComSpec

Post by DrKnS »

gene.pavlovsky wrote:где именно хранятся эти алиасы при загрузке
В консольном хосте. Это, чтобы было понятно, окно, в котором могут жить несколько процессов - фар, цмд, баш и т. п.
gene.pavlovsky wrote:Я знаю, что там у него в начале
Вангую, в начале у вас там [cmd.exe], что означает, что всё, что ниже, предназначено для процесса с именем cmd.exe.
Фар, в принципе, не обязан использовать эту секцию. Он должен использовать только свою - [far.exe].
Но мы заботимся о пользователях и, если в своей секции ничего подходящего не нашлось, проверяем еще и ту, которая соответствует текущему комспеку, предполагая, что пользователь бы, наверное, именно этого и хотел.

В вашем случае изначально комспек был установлен в cmd.exe. Вы пишете свой "klx", фар его не находит среди своих, но находит у комспека, всё работает. Потом вы внезапно назначаете любимой женойкомспеком баш, но алиасы по прежнему остались у cmd.exe, а cmd.exe для фара теперь никто и его манатки никого, кроме него самого, не интересуют.

"Что делать" - думаю, очевидно.
gene.pavlovsky
Posts: 173
Joined: Tue 16 Feb, 2010 17:55
Location: Luxembourg
Has thanked: 13 times
Been thanked: 9 times
Contact:

Алиасы doskey при использовании другого ComSpec

Post by gene.pavlovsky »

Спасибо, что разъяснили, никогда б не подумал, что в самом конхосте есть фича алиасов. Мне как юниксоиду это весьма странно. Значит, doskey общается с консольным хостом, а не с программой, которая внутри консоли выполняется (Far, cmd, bash ...). И когда фар анализирует комстроку, он читает список алиасов из конхоста, и проверяет, не алиас ли команда. Также проверяет, не встроенная ли команда (lua:, lm:, far:, ещё что-то?). Дальше ищет по Path. И в конце концов если ничего нигде не нашлось, посылает на выполнение комспеку. Так? А каким образом фар решает, что например `ls -l` выполнять без комспека, а `ls -l | less` - через комспек? По регулярному выражению тестируется выхождение за рамки ограниченного набора символов?

Поменял [cmd.exe] на [Far.exe], теперь алиасы доступны из-под обоих шеллов.
Добавил для удобства ещё такой алиас, если захочется динамически создавать какие-то алиасы.
`alias=doskey /exename=Far.exe`

А то doskey без аргументов по умолчанию создаёт алиасы для cmd.exe.

Макрос Alias (автор John Doe) подправил тоже, чтоб в Far.exe автогенерил свои макросы для перезагрузки и редактирования алиасов: http://forum.farmanager.com/viewtopic.p ... 65#p137365
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

Алиасы doskey при использовании другого ComSpec

Post by DrKnS »

В общих чертах так, да.
Если есть пайп, перенаправление, экранирование и т. п. то это уходит в комспек сразу, иначе - если не смогли найти самостоятельно.
Рекомендую на досуге посмотреть cmdline.cpp / execute.cpp, там не рокет сайнс, разобраться можно.
gene.pavlovsky
Posts: 173
Joined: Tue 16 Feb, 2010 17:55
Location: Luxembourg
Has thanked: 13 times
Been thanked: 9 times
Contact:

Алиасы doskey при использовании другого ComSpec

Post by gene.pavlovsky »

По-моему, я нашёл баг. В bash есть конструкция `[ ... ]` (conditional expression), а в Cygwin так ж есть команда `[.exe`, выполняющая такую же ф-цию - наверно, для каких-то скриптов не на shell-е. В общем, пробую ради забавы выполнить данную команду через свой ComSpec:
`[ $TERM ] && echo "TERM=$TERM" || echo "TERM is undefined"`
На вход ComSpec приходит `C:cygwinbin[.EXE $TERM ] && echo TERM=$TERM || echo TERM`, в пути до [.exe нету слэшей.
Наверно, [ запарывает работу какого-то регулярного выражения?
Для сравнения, [.exe и test.exe примерно одно и то же, лежат в той же директории, `test $TERM && echo "TERM=$TERM" || echo "TERM is undefined"` работает как надо.

Прекрасно! Сурсы, прекрасно, именно их мне и хотелось ) Завтра почитаю за обедом.
MDM
Posts: 90
Joined: Fri 02 Dec, 2005 20:47
Location: Москва
Has thanked: 4 times
Been thanked: 2 times

Алиасы doskey при использовании другого ComSpec

Post by MDM »

DrKnS wrote: Вангую, в начале у вас там [cmd.exe], что означает, что всё, что ниже, предназначено для процесса с именем cmd.exe.
1. doskey.exe при запуске в bash.exe выдаёт "ошибка в макросе", возможно надо экранировать "/" в параметрах запуска и в самих макросах
2. заголовок в файле сохраненных макросов не имеет значения, в powershell.exe отрабатывает без замечаний (даже если там [fake.exe])
3. открытие нового окна убивает макросы (если через start (без /b))
gene.pavlovsky
Posts: 173
Joined: Tue 16 Feb, 2010 17:55
Location: Luxembourg
Has thanked: 13 times
Been thanked: 9 times
Contact:

Алиасы doskey при использовании другого ComSpec

Post by gene.pavlovsky »

MDM,
1. У меня из bash `doskey /exename=Far.exe l=ls -l` работает без ошибок. Что именно у вас выдаёт ошибку в макросе?
2. Я не знаю про powershell, в моём случае когда было cmd.exe, то при стандартном ComSpec работали алиасы, при использовании стороннего (мой скрипт bashcmd.sh) - не работали. Поменял на Far.exe, работают и там, и там. Я так понимаю, что консольный хост хранит алиасы по группам, а программа, работающая в консоли, может запрашивать лишь свои собственные алиасы, какие-либо конкретно чужие (скажем, как сказано было выше, Far использует [Far.exe] И [cmd.exe], но не [fake.exe], хоть вообще все - наверно, ваш случай с powershell.
3. Новое окно в новой консоли - логично, что алиасы исчезают. У меня они грузятся при старте фара через
Macro { description="Aliases: Load on start";
area="Shell"; key="auto"; flags="RunAfterFARStart";
action=Reload;
}
где Reload - определённая выше ф-ция, выполняющая doskey /macrofile=...
User avatar
SUSim
Posts: 1637
Joined: Thu 18 Feb, 2010 17:32
Has thanked: 9 times
Been thanked: 26 times

Алиасы doskey при использовании другого ComSpec

Post by SUSim »

Я не фонат алиасов, но если надо, то почему не использовать сам far для разворачивания сокращений, независимо от комспека, это и макросом ИМХО можно сделать, я пользуюсь своим, и вроде норм: всякие cd и exec комплексно исполняет.
немного непривычно может показаться поначалу записать алиас...

у меня около десятка алиасов реализованных в фаре типа cd... и чуть больше конвеерного запуска - типа запусти это потом это, а затем это.

доскей на каждой машине свой, а вот макрос можно вместе с фаром таскать.
SimSU ··· ·· -- ··· ··-
Post Reply

Return to “Нужна помощь”