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

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

지금까지 나는 쉘의 세미콜론이 개행 문자와 같은 의미를 갖고 있다고 생각했습니다. 그래서 나는 놀랐다.

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

<name>알 수 없지만 다음 행은 알려져 있습니다. csh, tcsh, sh, kshbash동일하게 동작합니다. 최소한 csh별칭을 직접 사용하거나 세미콜론 이전에 스크립트를 가져오는 것은 중요하지 않습니다. 별칭은 세미콜론 다음에는 알 수 없지만 ;다음 명령줄에서는 알 수 있습니다. 이것은 버그입니까, 아니면 의도적인 동작입니까?

답변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

관련 정보