Bourne 쉘에 별칭 설정

Bourne 쉘에 별칭 설정

저는 "SH -c command" 명령이 포함된 스크립트를 사용하고 있습니다. 여기서 command는 Bourne 쉘로 해석되지 않는 bash의 별칭입니다. 이 별칭을 Bourne 셸로 설정하고 새 셸에서 작동하도록 만드는 방법에 대한 아이디어가 있습니까? 모두 감사합니다!

답변1

이것이 Linux의 실제 Bourne 쉘이라면 놀랄 것입니다. Bourne 쉘이 이제 Linux로 포팅되었지만 일반적으로 기본적으로 설치되거나 패키지되지 않습니다.

고고학 목적으로만 설치할 수 있습니다.

sh어쩌면 Bourne 쉘 (현재는 인터프리터 또는 다른 POSIX sh언어라고도 함)(또한 고대 쉘이라고도 함 sh(현대 s는 Bourne 쉘에서 파생되었지만 sh또한 다름)) 에 대해 혼동을 느꼈을 수도 있습니다 .

Bourne 쉘에는 별칭이 없습니다. 현대 sh는 합니다.

그러나 별칭은 현재 셸에 로컬입니다. 새 셸( bash, sh, csh, ...) 을 실행하면 zsh새 셸은 이러한 별칭을 상속하지 않습니다.

새 셸에서 이러한 별칭을 다시 정의해야 합니다.

bash와 호환되는 구문으로 별칭 중 하나의 정의를 덤프하는 방법이 있습니다 sh. 그래서 당신은 이것을 할 수 있습니다 :

alias foo='echo foo' # alias defined in bash
foo_definition=$(alias foo)
sh -c "$foo_definition
foo"

또는 간단하게:

sh -c "$(alias foo)
foo"

이제 한 가지 문제는 이것이 작동하지 않는다는 것입니다 sh. 가장 먼저 눈에 띄는 것은 우리가 이것을 하지 않는다는 것입니다:

sh -c "$(alias foo);foo"

어느 것이 작동할까요?아니요 sh구현하다.

별칭은 실제로 일종의 매크로 확장과 비슷하기 때문입니다. 별칭 확장은 구문 분석 전에 수행되므로 alias foo='echo foo'; foo명령을 실행할 때 alias해당 행은 이미 구문 분석되었습니다.

별칭 정의를 한 줄에 배치하고 다음 줄에 사용하면 일부 셸의 문제가 해결되지만 일부 다른 셸( 또는 등 yash) zshsh -c전체 코드를 전체적으로 구문 분석하므로 별칭 확장이 작동하지 않습니다.

그러나 별칭은 일부 텍스트를 다른 텍스트로 바꾸는 매크로이므로 수동으로 바꾸는 것이 좋습니다.

다음을 수행하여 별칭 값을 얻을 수 있습니다.

eval "$(alias foo | sed '1s/ /_/')"

별칭의 정의를 변수 foo에 저장합니다.$alias_foo

그런 다음 다음을 수행할 수 있습니다.

sh -c "$alias_foo"

별칭 값을 foo쉘 코드로 에 전달합니다 sh.

이러한 목적으로 별칭 대신 함수를 사용하는 것이 더 나을 수도 있습니다. 별칭과 마찬가지로 함수는 현재 셸에 로컬입니다. 일부 쉘은 동일한 인터프리터의 다른 호출 rc과 같은 기능을 내보낼 수 있습니다.bash

foo() { echo foo; }
export -f foo
sh -c foo

sh구현된 시스템 에서만 사용할 수 있습니다 bash(주로 Apple OS/X 및 일부 Linux 기반 시스템에만 해당).

보다 이식성이 뛰어난 접근 방식은 별칭을 사용하여 함수 정의를 전달된 코드에 덤프하는 것입니다 sh -c.

sh -c "$(typeset -f foo); foo"

이번에는 함수가 언어의 실제 구성이기 때문에 별칭이 아닌 함수로 확장 시간과 구문 분석 시간에 문제가 없습니다.

그러나 함수 정의에 구문적으로 유효 sh하고 확장을 사용하지 않는 코드가 포함되어 있는지 확인해야 합니다 bash.

답변2

특히 Bash의 경우 -

이는 Bash를 사용하여 명령을 실행할 때 -c비대화형 모드에서 시작되고 특히 별칭 확장이 비활성화되기 때문에 발생합니다.

일반적으로 스크립트에 별칭을 사용하면 안 되며, 대신 셸 함수나 다른 스크립트를 사용하세요. 만약 너라면진짜별칭을 사용하고 싶다면 시도해 보십시오 bash -ic <alias_command>. 대화형 모드에서 셸을 시작 -i하고 구성 파일(예: )을 읽은 /.bashrc다음 별칭 확장을 활성화합니다.

참고 - Bash에 표시되는 별칭은 상위 셸이 아닌 구성 파일에서 나옵니다.

관련 정보