Вновь определенный псевдоним внутри другого псевдонима, первое выполнение завершится ошибкой

Если мы определим и используем псевдоним B внутри другого псевдонима A, первое выполнение A завершится ошибкой. Например,

alias A='alias B="which ls"; B;'

Исполнение в первый раз будет выглядеть (в bash)

bash: B: command not found

Приведенный выше пример представляет собой упрощенную конструкцию. на практике такое использование может встречаться неявно.

Причина может заключаться в следующем: когда мы выполняем псевдоним A, все расширения выполняются до выполнения, но B не определен, когда мы выполняем A в первый раз.

Итак, есть ли способ сделать первое выполнение успешным?

Ситуация, с которой я столкнулся, сложнее, чем описанная выше. Мой псевдоним выглядит так (в tcsh)

псевдоним A 'cmd1; cmd2; B -v arg_of_B; cmd3; cmd4;'

где B — псевдоним, определенный cmd2. Кроме того, определение B выглядит так (в tcsh)

псевдоним B 'источник /path/to/script.csh'

Таким образом, использование eval для отсрочки выполнения B может не сработать, потому что eval создаст новую оболочку для выполнения команды. Еще один фактор, усложняющий это, заключается в том, что за псевдонимом следуют аргументы. Я пытался использовать exec, но безуспешно.


person Yang Li    schedule 09.05.2013    source источник
comment
Вы можете подумать, не является ли функция оболочки более подходящей в вашей ситуации, чем псевдоним.   -  person chepner    schedule 09.05.2013
comment
Да, функция оболочки, если она доступна, будет полезна, однако мы не можем определять функции в tcsh.   -  person Yang Li    schedule 10.05.2013
comment
Есть ли в этом вопросе какой-то bash компонент?   -  person chepner    schedule 10.05.2013
comment
Я верю, что это относится и к bash. Определение функции оболочки — это одно из решений для bash, а использование eval — еще одно элегантное решение как для bash, так и для tcsh, как указано choroba ниже.   -  person Yang Li    schedule 11.05.2013


Ответы (1)


Проблема может быть упрощена до простого псевдонима. Следующее не работает в первый раз:

alias A=ls ; A

Чтобы отложить расширение, вы можете использовать eval:

alias A=df ; eval A

(Проверено в bash и tcsh).

person choroba    schedule 09.05.2013
comment
Я обновил сообщение о более сложной ситуации, с которой я сталкиваюсь. Не могли бы вы помочь проверить это? - person Yang Li; 10.05.2013
comment
@YangLi: eval не работает в подоболочке. - person choroba; 11.05.2013
comment
ДА, вы правы, eval - это окончательное решение. Большое спасибо! - person Yang Li; 11.05.2013
comment
Для тех, кто путается с exec, eval и исходным кодом в оболочке, как я, я нахожу полезную ссылку: ссылка - person Yang Li; 11.05.2013