구문 내부에서 별칭을 실행하고 싶습니다 bash -c
.
이것bash
수동설명하다:
셸이 비대화형인 경우
expand_aliases
셸 옵션을 사용하여 설정 하지 않으면 별칭이 확장되지 않습니다.shopt
hi
이 예에서 명시적으로 설정해도 별칭을 찾을 수 없는 이유는 무엇입니까 expand_aliases
?
% bash -O expand_aliases -c "alias hi='echo hello'; alias; shopt expand_aliases; hi"
alias hi='echo hello'
expand_aliases on
bash: hi: command not found
나는 뛰고있어 GNU bash, version 5.0.0(1)-release (x86_64-pc-linux-gnu)
.
컨텍스트: 다음을 포함하는 스크립트와 같이 유휴 우선순위에서 별칭을 실행할 수 있기를 원합니다.
#!/bin/bash
exec chrt -i 0 nice -n 19 ionice -c 3 bash -c ". ~/.config/bash/aliases; shopt -s expand_aliases; $(shell-quote "$@")"
내 콘텐츠가 읽히는 것을 bash -i
원하지 않기 때문에 사용을 피하고 싶습니다 ..bashrc
답변1
사용중인 동일한 줄에 별칭을 설정하면 작동하지 않는 것 같습니다. 아마도 실제 구문 분석 단계 이전에 명령줄 처리 초기에 별칭을 확장하는 방법과 관련이 있을 것입니다. 대화형 셸에서:
$ alias foo
bash: alias: foo: not found
$ alias foo='echo foo'; foo # 2
bash: foo: command not found
$ alias foo='echo bar'; foo # 3
foo
$ foo
bar
사용된 별칭은 한 줄 뒤에 있습니다. 두 번째 명령에서는 방금 설정한 별칭을 찾을 수 없지만 세 번째 명령에서는 이전에 설정한 별칭을 사용합니다.
따라서 문자열에 개행 문자를 추가하면 작동합니다 -c
.
$ bash -c $'shopt -s expand_aliases; alias foo="echo foo";\n foo'
foo
bash -O expand_aliases -c ...
( 대신 스크립트에서 사용할 수도 있지만 shopt
줄 바꿈에 도움이 된다는 뜻은 아닙니다.)
또는 별칭 대신 쉘 함수를 사용할 수 있으며 이는 다른 방법으로도 더 좋습니다.
$ bash -c 'foo() { echo foo; }; foo'
foo
답변2
ilkkachu의 제안에 따라 내 의견을 답변으로 바꿉니다.
Bash 매뉴얼(질문에 링크됨)은 같은 줄에 별칭 정의와 명령이 있을 때 별칭을 처리하는 방법에 대한 설명을 제공합니다.
인용문(명확성을 위해 약간의 형식 지정):
별칭의 정의 및 사용에 관한 규칙은 다소 혼란스럽습니다.Bash는 해당 줄이나 복합 명령에서 명령을 실행하기 전에 항상 입력의 완전한 한 줄과 복합 명령을 구성하는 모든 줄을 읽습니다.
별칭은 명령이 실행될 때가 아니라 명령을 읽을 때 확장됩니다. 따라서 다른 명령과 같은 줄에 나타나는 별칭 정의는 다음 입력 줄을 읽을 때까지 적용되지 않습니다. 줄에서 별칭 정의 뒤에 오는 명령은 새 별칭의 영향을 받지 않습니다.
이 동작은 함수를 실행할 때도 문제가 됩니다. 별칭은 함수 정의 자체가 명령이기 때문에 함수가 실행될 때가 아니라 함수 정의를 읽을 때 확장됩니다. 따라서 함수에 정의된 별칭은 함수가 실행된 후에만 사용할 수 있습니다.
안전을 위해 항상 별칭 정의를 별도의 줄에 배치하고 복합 명령에 별칭을 사용하지 마십시오.
ilkkachu의 답변은 이 문제에 대한 몇 가지 가능한 해결책을 제공합니다.