쉘 스타일로 선언된 함수를 다른 쉘 유형에서 사용할 수 있나요?

쉘 스타일로 선언된 함수를 다른 쉘 유형에서 사용할 수 있나요?

Linux 시스템에 대한 많은 공통 함수 정의가 포함된 bash 스크립트가 있습니다.

그것을 얻고 다른 쉘 버전(csh 및 ksh)의 기능을 사용할 수 있습니까?

답변1

Stéphane Chazelas가 쓴 것처럼논평, csh관련 파일에는 tcsh기능이 없으므로 어쨌든 갖고 있는 기능 파일을 가져올 수 없습니다.

그러나 Bourne과 유사한 쉘은 구문과 기능을 공유하는 경우가 많으며 실제로 bash많은 기능을 차용 ksh하지만 이러한 쉘의 일부 기능은 호환되지 않습니다 dash.우분투동작이 원래 Bourne 쉘에 더 가깝습니다.

발생하는 또 다른 문제는 함수뿐만 아니라 함수가 호출할 수 있는 명령에도 관련됩니다. Ubuntu에서 이러한 기능을 사용하다가 갑자기 FreeBSD로 이동한 경우 유사 find하거나 ps자주 사용되는 옵션이 다르게 동작하거나 누락되었음을 금방 알 수 있습니다.

따라서 함수를 사용할 수 있도록 하려면 명령과 옵션의 이식성을 고려하고 POSIX 표준 및 원래 Bourne 셸 구문에 최대한 가깝게 함수를 작성하는 두 가지를 권장합니다.

sudo또는 필요한 셸을 항상 설치할 수 있는 경우(사용 중인 시스템에 대한 권한이 없으면 발생하지 않을 수 있음) 특정 셸 구문으로 함수를 작성하세요.

바라보다이식 가능한 스크립트를 작성하는 것이 언제 중요합니까?더 많은 정보를 얻으세요.

답변2

일반적으로 말하면 그렇지 않습니다.

특히 csh( 및 ) 구문은 파생 쉘( , , , ) 구문과 너무 다르기 tcsh때문에 스크립트를 이해하지 못할 가능성이 높으며 그 반대의 경우도 마찬가지입니다.shshbashkshzshsh

이러한 sh쉘은 때때로 기능이나 심지어 전체 스크립트를 공유할 수 있지만 이는 "최소 공통 분모 쉘"(일반적으로 sh)인 경우에만 가능합니다. 그러나 이는 일반적으로 좋은 생각이 아닙니다.

각 셸을 Perl, Ruby, Python과 같은 별도의 스크립팅 언어로 생각하세요. 그것들을 섞지 말고 일반적으로 한 통역사가 다른 통역사의 소스를 이해할 수 있다고 가정하지 마십시오.

답변3

thump에 대한 함수 주위에 래퍼 스크립트를 만드는 것은 쉽습니다.

#!/bin/bash

doSomething()
{
    ...
}

doSomethingElse()
{
    ...
}

FUNCTION_NAME=$1
shift
${FUNCTION_NAME} "$@"

exit $?

부르다:

/path/to/functionWrapper.sh doSomething [<param1>] [...]

답변4

특히 C 셸의 경우 C 셸이 기능을 지원하지 않기 때문에 이렇게 할 수 없습니다. 이 외에도 C 쉘은 다른 구문을 사용합니다. 예를 들어 다음 C 셸 코드 조각은 Bash에서 사용하는 코드 조각과 다릅니다.

if ( $days > 365 ) then
   echo This is over a year.
endif
set i = 2
set j = 1
while ( $j <= 10 )
   echo '2 **' $j = $i
   @ i *= 2
   @ j++
end

관련 정보