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
때문에 스크립트를 이해하지 못할 가능성이 높으며 그 반대의 경우도 마찬가지입니다.sh
sh
bash
ksh
zsh
sh
이러한 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