Псевдоним Csh с perl one-liner оценивает, когда создается псевдоним, а не когда используется псевдоним - PullRequest
3 голосов
/ 26 августа 2010

Я знаю, я знаю, я должен использовать современную оболочку ... В любом случае, вот псевдоним:

  alias p4client echo `p4 info | perl -ne 's/Client name: (.*)$/print $1/e'` 

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

Ответы [ 2 ]

7 голосов
/ 26 августа 2010

Единственный трюк - обратный слэш, экранирующий одинарные кавычки и окружающий все остальное одинарными кавычками:

alias p4client 'echo `p4 info | perl -ne '\''s/Client name: (.*)$/print $1/e'\''`'

Хотя Perl можно упростить:

alias p4client 'echo `p4 info | perl -ne '\''print /Client name: (.*)/'\''`'

и echo и `` говорят, перехватить вывод, который эти команды распечатают, и распечатать его; вместо этого просто напечатайте вывод (только если perl включает символ новой строки вместо того, чтобы убрать его из вывода p4, только чтобы echo повторно его добавил):

alias p4client 'p4 info | perl -ne '\''print /Client name: (.*)/s'\'

хотя теперь там нет ничего недружелюбного двойных кавычек, поэтому:

alias p4client "p4 info | perl -ne 'print /Client name: (.*)/s'"

Здесь нет ничего отличного от того, как вы бы это делали в bash, кроме отсутствия = после p4client.

3 голосов
/ 26 августа 2010

Значение псевдонима должно быть заключено в кавычки, поскольку оно содержит специальные символы. Попробуйте это:

alias p4client "echo "\`"p4 info | perl -ne 's/Client name: (.*)'\"\$"'/print '\"\$"'1/e'"\`

И, черт возьми, csh - худшая оболочка в мире. Правила цитирования ужасны . Я растопил свой мозг, пытаясь придумать это, и теперь у меня не осталось сил объяснить это. Извините, пока у меня аневризма.

Редактировать 1: Вот, ваши драгоценные знаки доллара $ превратились в это чудовище! '\"\$"'

Редактировать 2: ОК, я начинаю восстанавливаться. Моя сила возвращается с каждым мгновением, которое я провожу в сладких объятиях моей любимой женщины. Беги, цш, ты, скверный зверь!

Причина, по которой это так ужасно, заключается в том, что все это должно быть удвоено. Один раз, чтобы знаки доллара передавались в Perl, и другой раз, чтобы они благополучно миновали оператор псевдонима. Если это помогает, цель состоит в том, чтобы псевдоним был похож на это:

% alias
4client echo `p4 info | perl -ne 's/Client name: (.*)'\$'/print '\$'1/e'`

Причина последовательности '\$' заключается в том, что csh не может избежать знаков доллара внутри двойных кавычек. Вы не можете просто поставить обратную косую черту. Вы фактически должны временно закрыть кавычки, использовать \$ вне кавычек , а затем заново открыть кавычки.

...