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