Страница 1 из 1

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, например) можете оставить при себе.

Re: tcsh: history substitution inside aliases

Добавлено: 2007-12-21 15:05:05
Alex Keda
а ты скрипт сделай и на него альяс :)

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
Еще варианты?

Re: tcsh: history substitution inside aliases

Добавлено: 2008-01-16 17:25:17
zg
Гость писал(а):Есть алиас вида:

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

> 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 - это диапазон аргументов, где ^ - первый и $ - последний

Re: tcsh: history substitution inside aliases

Добавлено: 2008-01-16 22:44:47
zg
Гость писал(а):
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 сёдня первый раз читал, спорить не буду :)
я так его до конца и не дочитал; отрывками только. Всегда когда читаю по порядку, то клонит в сон или отвлекаюсь на что-то более интересное (типа новой мысли), т.к. терпения не хватает. С конца прикольно читать, намного понятней и воды нет.