이후에는 새 별칭을 사용할 수 없습니다.

이후에는 새 별칭을 사용할 수 없습니다.

지금까지 나는 쉘의 세미콜론이 (어쨌든) 줄 바꿈과 같은 의미를 가지고 있다고 생각했습니다. 그래서 나는 그것에 놀랐다.

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

<name>다음 줄에는 알려져 있지만 알 수 없습니다. csh, tcsh, sh, kshbash동일하게 동작합니다. 최소한 csh별칭이 직접 사용되는지 또는 스크립트가 semccolon 이전에 제공되는지는 중요하지 않습니다. 별칭은 이후에 알려지지 않았지만 ;다음 명령줄에서는 알려집니다. 이것은 버그입니까, 아니면 의도된 동작입니까?

답변1

사용 중인 별칭 구문은 POSIX 셸에 적합하지 않습니다. POSIX 셸의 경우 다음을 사용해야 합니다.

alias name='replacement'

그러나 모든 쉘의 경우 별명 대체가 파서 초기에 수행되므로 이는 작동하지 않습니다.

별칭 설정이 실행되기 전에 파서가 전체 줄을 읽었으므로 명령줄이 작동하지 않습니다.

별칭이 다음 명령줄에 나타나면 작동할 것입니다.

답변2

이 동작은 POSIX에서 의도하고 지정합니다.별칭 대체.

쉘 수행 직후 별칭이 대체되었습니다.토큰 인식그리고 그 어떤 것보다 먼저문법 규칙적용된. alias 를 호출했을 때 <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과 같이 정의할 수 있습니다 .functionalias

$ 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

관련 정보