Новый псевдоним недоступен после ;

Новый псевдоним недоступен после ;

До сих пор я думал, что точка с запятой в оболочке имеет (каким-то образом) то же значение, что и перенос строки. Поэтому я был удивлен, что для

alias <name>=<replacement text>; <name>

<name>неизвестно, в то время как известно в следующей строке. csh, tcsh, sh, kshи bashведут себя одинаково. По крайней мере, cshневажно, используется ли псевдоним напрямую или скрипт исходит до точки с запятой — псевдонимы неизвестны после, ;но известны в следующей командной строке. Это ошибка или такое поведение задумано?

решение1

Синтаксис псевдонима, который вы используете, не подходит для оболочки POSIX. Для оболочки POSIX вам необходимо использовать:

alias name='replacement'

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

Перед выполнением настройки псевдонима вся строка была прочитана парсером, и по этой причине ваша командная строка не будет работать.

Если псевдоним появится в следующей командной строке, он будет работать.

решение2

Такое поведение предусмотрено и определено в POSIXЗамена псевдонима.

Псевдоним был заменен сразу после выполнения оболочкиРаспознавание токенови прежде чем любойГрамматические правилаприменено. В момент вызова псевдонима <name>команда aliasне была выполнена.

решение3

Если ты действительно хочешьодин лайнер, тогда ты можешьиспользуйте функцию вместо псевдонима.

Например, вы создаете py3псевдоним, но он работает только во второй строке:

$ alias py3=python3; py3 -c 'print("hello, world")'

Command 'py3' not found, did you mean:

  command 'py' from deb pythonpy
  command 'hy3' from deb python3-hy
  command 'pyp' from deb pyp

Try: sudo apt install <deb name>

$ py3 -c 'print("hello, world")'
hello, world

Вы можете определить py3как functionвместо alias:

$ function py3() { python3 "$@"; }; py3 -c 'print("hello, world")'
hello, world

Или export -fперед использованием в дочернем процессе позже:

$ function py3() { python3 "$@"; }; export -f py3; bash -c "py3 -c 'print("'"hello, world"'")'"
hello, world

И если вы осознаете разницупеременная против псевдонима/функции, то вы можете использоватьпеременнаяслишком:

$ py3='python3'; $py3 -c 'print("hello, world")'
hello, world

и не нужно export -f:

$ py3='python3'; bash -c "$py3 -c 'print("'"hello, world"'")'"
hello, world

Связанный контент