tcsh: history substitution inside aliases

Программирование на sh, быть может немного про альтернативные языки
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Гость
проходил мимо

tcsh: history substitution inside aliases

Непрочитанное сообщение Гость » 2007-12-21 11:25:42

Есть алиас вида:

Код: Выделить всё

> alias	rebld	'( make cleandir ; \!#^-2 ; \!#^ obj depend all install ; \!#^-5 )'
> alias rebld
( make cleandir ; !#^-2 ; !#^ obj depend all install ; !#^-5 )
Все бы хорошо, но rebld не работает. При написании в консоли rebld получаю: Bad ! arg selector.
Игра с кавычкаи и backslash'ами вокруг метасимволов !#^-2 результата не принесла. Однако без alias'а команда работает и превращается из ( make cleandir ; !#^-2 ; !#^ obj depend all install ; !#^-5:p ) в ( make cleandir ; make cleandir ; make obj depend all install ; make cleandir ; make cleandir ). (`:p' - говорит, что результат надо просто вывести не запуская)

Any ideas how to fix my hands? Криворукий я...видать. :(

ps, идеи поменять интепретатор (на bash, например) можете оставить при себе.

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35411
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: tcsh: history substitution inside aliases

Непрочитанное сообщение Alex Keda » 2007-12-21 15:05:05

а ты скрипт сделай и на него альяс :)
Убей их всех! Бог потом рассортирует...

Гость
проходил мимо

Re: tcsh: history substitution inside aliases

Непрочитанное сообщение Гость » 2008-01-16 14:14:42

Ндя...
/etc/csh.cshrc:

Код: Выделить всё

foreach	func	(hello rebld)
alias	$func	source /etc/csh.func $func
end
/etc/csh.func:

Код: Выделить всё

@ pos=1
while ($pos <= $#argv)
    switch ($argv[$pos])
	case [Hh]ello:
	    echo Hello World\!
	    breaksw
	case rebld:
	    ( make cleandir; \
	      !#^-2; \
              !#^ obj depend {,inst}all; \
	      !#^-5 )
	    breaksw
	default:
	    echo "*** no such function: $argv[$pos] ***"
    endsw
    @ pos++
end
Еще варианты?

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: tcsh: history substitution inside aliases

Непрочитанное сообщение zg » 2008-01-16 17:25:17

Гость писал(а):Есть алиас вида:

Код: Выделить всё

> alias	rebld	'( make cleandir ; \!#^-2 ; \!#^ obj depend all install ; \!#^-5 )'
> alias rebld
( make cleandir ; !#^-2 ; !#^ obj depend all install ; !#^-5 )
Все бы хорошо, но rebld не работает. При написании в консоли rebld получаю: Bad ! arg selector.
всё правильно, потому что ты ссылаешься на минус вторые и минус пятые аргументы после алиаса, а вызываешь без аргументов

Код: Выделить всё

shluz# alias rebld '( make cleandir ; \!#^-2 ; \!#^ obj depend all install ; \!#^-5 )'
shluz# alias
h       (history 25)
j       (jobs -l)
la      (ls -a)
lf      (ls -FA)
ll      (ls -lA)
print   (echo !*; echo !#^-2)
rebld   ( make cleandir ; !#^-2 ; !#^ obj depend all install ; !#^-5 )
shluz# rebld hello my little nice rebld
make: don't know how to make cleandir. Stop
hello: Команда не найдена.
hello: Команда не найдена.
hello: Команда не найдена.

Гость
проходил мимо

Re: tcsh: history substitution inside aliases

Непрочитанное сообщение Гость » 2008-01-16 18:39:06

zg писал(а):всё правильно, потому что ты ссылаешься на минус вторые и минус пятые аргументы после алиаса, а вызываешь без аргументов
а есть способ выбросить alias из истории? я думал скобки () это должны делать, но как оказалось - нет. Хочется юзать историю команд в алиасе, чтоб сократить повтор слов до минимума. Или для этой цели можно как-то задействовать inline expansion {}? Впрочем более хитрое чем {,{de,}inst}all (all deinstall install, удобно для портов) мне не приходит в голову, т.к. как использовать их между несколькими командами пока не додумался.

ps, а причем тут минус? я думал x-y - это диапазон аргументов, где ^ - первый и $ - последний

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: tcsh: history substitution inside aliases

Непрочитанное сообщение zg » 2008-01-16 22:44:47

Гость писал(а):
zg писал(а):всё правильно, потому что ты ссылаешься на минус вторые и минус пятые аргументы после алиаса, а вызываешь без аргументов
а есть способ выбросить alias из истории? я думал скобки () это должны делать, но как оказалось - нет.
круглые скобки - просто объединение команд
Гость писал(а):Хочется юзать историю команд в алиасе, чтоб сократить повтор слов до минимума. Или для этой цели можно как-то задействовать inline expansion {}?
можно судя по ману
man csh писал(а): history-search-backward (M-p, M-P)
Searches backwards through the history list for a command
beginning with the current contents of the input buffer up to
the cursor and copies it into the input buffer. The search
string may be a glob-pattern (see Filename substitution) con-
taining `*', `?', `[]' or `{}'. up-history and down-history
will proceed from the appropriate point in the history list.
Emacs mode only. See also history-search-forward and i-search-
back.
Гость писал(а):Впрочем более хитрое чем {,{de,}inst}all (all deinstall install, удобно для портов) мне не приходит в голову, т.к. как использовать их между несколькими командами пока не додумался.
а к чему такие хитрости? :) порты прекрасно собираются по make install clean или это длинно? :)
Гость писал(а):ps, а причем тут минус? я думал x-y - это диапазон аргументов, где ^ - первый и $ - последний
очень может быть, я ман по csh сёдня первый раз читал, спорить не буду :)

Гость
проходил мимо

Re: tcsh: history substitution inside aliases

Непрочитанное сообщение Гость » 2008-01-17 22:22:05

zg писал(а):
Гость писал(а):
zg писал(а):всё правильно, потому что ты ссылаешься на минус вторые и минус пятые аргументы после алиаса, а вызываешь без аргументов
а есть способ выбросить alias из истории? я думал скобки () это должны делать, но как оказалось - нет.
круглые скобки - просто объединение команд
(setenv PATH /bin; echo $PATH); echo $PATH. Если можно спокойно менять переменные окружения внутри скобок, то почему нельзя юзать историю там же? Ладно, наверное мне все-таки стоит дочитать tutorial. Привычка додумывать пошла от sh(1).
zg писал(а):
Гость писал(а):Хочется юзать историю команд в алиасе, чтоб сократить повтор слов до минимума. Или для этой цели можно как-то задействовать inline expansion {}?
можно судя по ману
man csh писал(а): history-search-backward (M-p, M-P)
Searches backwards through the history list for a command
beginning with the current contents of the input buffer up to
the cursor and copies it into the input buffer. The search
string may be a glob-pattern (see Filename substitution) con-
taining `*', `?', `[]' or `{}'. up-history and down-history
will proceed from the appropriate point in the history list.
Emacs mode only. See also history-search-forward and i-search-
back.
а как исполнить интерактивную команду не через bindkey? есть какой-то способ экспорта editor commands в скрипты?
zg писал(а):
Гость писал(а):Впрочем более хитрое чем {,{de,}inst}all (all deinstall install, удобно для портов) мне не приходит в голову, т.к. как использовать их между несколькими командами пока не додумался.
а к чему такие хитрости? :) порты прекрасно собираются по make install clean или это длинно? :)
а ты только оффиц. порты используешь? никогда не хакал порт, например чтобы собрать emacs из cvs? Если обновление грохнется во время компиляции, то target deinstall и тем более install так и не наступит. Да и в случае с большим или очень специфичным колвом портов иногда проще сделать что-то типа apply 'echo make {,{de,}inst}all -C/usr/ports/ -C%1' `pkg_info -Xoq docbook\|xml\|sgml`(без echo, естественно). Чем короче команда, тем проще ее править и набрать, а когда в ней повторяются слова, то это начинает не только мазолить глаза, но и запутывать.
zg писал(а):
Гость писал(а):ps, а причем тут минус? я думал x-y - это диапазон аргументов, где ^ - первый и $ - последний
очень может быть, я ман по csh сёдня первый раз читал, спорить не буду :)
я так его до конца и не дочитал; отрывками только. Всегда когда читаю по порядку, то клонит в сон или отвлекаюсь на что-то более интересное (типа новой мысли), т.к. терпения не хватает. С конца прикольно читать, намного понятней и воды нет.