2015-01-06 6 views
0

Я хотел бы создать псевдоним csh, который выполняет одну операцию, если вызывается без аргументов, а вторая - при вызове с помощью одного аргумента. Кто-нибудь знает как это сделать? (Попытка ссылаться на аргумент, который не был передан, вызывает ошибку).csh-псевдоним с переменным числом аргументов

Phillip M. Feldman

ответ

1

Псевдонимы в Tcsh ограничены; для более продвинутых вещей, я обнаружил, что лучший способ заключается в source а (т) CSH сценариев, например, так:

alias my-cmd 'source ~/.tcsh/my-cmd.tcsh' 

И ~/.tcsh/my-cmd.tcsh будет содержать что-то вроде:

if ($1 != '') then 
     echo "we have an argument: $1" 
else 
     echo "we don't have an argument" 
endif 

Пример вывода:

% my-cmd 
we don't have an argument 
% my-cmd hello 
we have an argument: hello 

Теперь, также может быть возможно сделать это только с псевдонимом, но это будет гораздо более ремонтопригодны & очиститель в конечном счете, ИМХО.

(Я принимал tcsh здесь, так как почти все, или, возможно, даже все, c shells являются tcsh в эти дни).

+0

его выходит за рамки любого механизма псевдонимов оболочки ([ТКС] ш) для обработки аргументов. '[t] csh' не выполняет функции, поэтому @PhillipMFeldman это ваш лучший выбор. Либо это, либо переключиться на оболочку, которая поддерживает функции, что, конечно же, является «правильным ответом». Я понимаю, что ваша рабочая среда может не допускать этого, поэтому, если это так, используйте вышеизложенное! Всем удачи. – shellter

+0

@shellter "* переключиться на оболочку, которая поддерживает функции, что, конечно же, является« правильным ответом »... Ну нет? Просто потому, что (t) csh не поддерживает определенную функцию или потому, что вам не нравится он переключает его на «правильный» ответ ... – Carpetsmoker

+0

Хм ... Извините, если я обидел. Не намерение. Может быть, я должен был сказать OP, либо использовать это работоспособное решение (которое у меня есть), либо переключиться на оболочка, которая поддерживает функции, поскольку вы, похоже, хотите, чтобы функции поддерживались только функциями. Удачи всем! – shellter

0

Легко сделать - извините, я опаздываю на вечеринку.

alias iftest 'if (\ !: 0! = \!: $) Echo "Last arg =" \!: $; If (\ !: 0 == \!: $) Echo "Нет аргументов. "'

Это просто проверяет, является ли 0-й аргумент (= сам« истребителем »), а последние аргументы одинаковы, и если они есть, предполагается, что аргументов нет. Это, конечно, не обязательно верно, но, надеюсь, работает в практике.

+0

Не будет ли это не работать для краевых случаев, таких как 'my-command 1 2 3 4 3 2 1'? – hepcat72

+0

Ваши два отрицания отмените, так что ответ да - он будет работать, поскольку «моя команда» отличается от «1». Случай, который не будет работать, - «my-command 1 2 3 4 3 2 my-command» Но я надеюсь, что этот случай не будет t встречаются в природе ;-) – AstroArtie

+0

Ницца. Ты поймал меня. Хотя я думаю, что мое использование «не будет» в разговорной речи понимается в общем смысле. То естьесли вы приравняете «не работать» с «неудачей» (для ясности), я думаю, что кто-то ответил бы на вопрос «Не будет ли это неудачно ...» с «Нет». Технически вы правы, как грамматически, так и с примером оболочки. Кроме того, мой комментарий был глупым, поскольку вы уже указывали, на что я ошибочно пытаюсь привлечь внимание, поэтому я просто пойду в угол и сдержу свой коллоквиализм, пока вы не отнесете его от меня в следующий ответ , – hepcat72

0

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

Вы можете установить аргументы в виде массива и запроса на основе размера массива:

alias testing 'set args_=(\!*); if ($#args_ > 0) echo "this command has $#args_ arguments" endif' 
Смежные вопросы