다양한 *nix 버전에서 실행될 수 있도록 셸 스크립트를 업데이트해야 합니다.

다양한 *nix 버전에서 실행될 수 있도록 셸 스크립트를 업데이트해야 합니다.

다양한 *nix 버전(red hat linux, hp ux, Solaris)에서 실행되도록 업데이트해야 하는 ksh 및 csh 스크립트가 많이 있습니다. 쉘은 각 서버의 홈에 마운트되며 각 환경에서 작동하도록 해야 합니다.

Linux에서는 찾을 수 없는 일부 특정 명령에 문제가 있습니다. 예를 들어 스크립트는 를 사용하는데 , 이는 Linux에서 nawk로 대체되어야 합니다 .gawk

/usr/xpg4/bin/grep솔라리스에서는 grep-q(quiet) 옵션을 사용할 수 없지만 Linux의 grep은 사용할 수 있고 이 환경에는 /usr/xpg4/bin/grep존재하지 않기 때문에 스크립트도 사용됩니다 .

모든 스크립트를 건드리고 싶지 않기 때문에 좀 더 포괄적인 솔루션을 찾고 있습니다.

별칭을 설정하려고했는데 작동합니다. 그러나 대화형 모드에서만 가능합니다. 스크립트에 별칭을 사용하는 것은 권장되지 않는 것 같습니다...

시스템 디렉토리에 심볼릭 링크를 추가할 수 있지만 이 '모의' 설정을 관리하려면 관리자 권한이 필요하며 설정은 더 이상 이식 가능하지 않습니다.

저는 시스템 관리에 익숙하지 않기 때문에 이런 종류의 요구에 맞는 표준 솔루션을 놓칠 수 있습니다.

다시 작성하지 않고도 이식 가능한 스크립트를 가지려면 어떻게 해야 합니까?

답변1

올바른 접근 방식은 POSIX호환되는 명령(예: awk, not nawk또는 gawk, grep, not 사용 /usr/xpg4/bin/grep), 옵션 및 구문을 고수하고 PATH다음과 같이 설정하는 것입니다.

PATH=$(getconf PATH):$PATH

또는 Solaris에서 레거시 Bourne 쉘을 사용하는 경우:

PATH=`getconf PATH`:$PATH

그게 전부입니다. 거기서 실행된 스크립트는 수정되지 않은 채 실행되어야 합니다. #!/bin/sh그러나 대중적인 믿음에도 불구하고 shebang을 사용하지 마십시오 .~ 아니다 POSIX준수. Shebang을 전혀 사용하지 마십시오. 사용하여 컴퓨터에서 command -v sh어떤 쉘을 사용할 수 있는지 확인할 수 있습니다.POSIX

그러나 이식성이 없는 스크립트를 변경하지 않고 유지하려는 것 같습니다. 그런 다음 구문을 사용하여 명령에 대해 이전에 제안된 접근 방식을 유지 POSIX하고 다른 OS에서 처리할 비 이식성 명령에 대한 프런트 엔드를 추가할 수 있습니다. 스크립트가 Bourne 또는 Csh 스타일 셸을 사용하므로 별칭과 함수는 이식 가능하지 않으므로 PATH. 예를 들어:

sh / ksh / bash / ... :

PATH=~/bin:`getconf PATH`:$PATH 

csh :

set path = ( ~/bin `getconf PATH` $path)

-

mkdir -p ~/bin
cd ~/bin
cat > awk <<%
#!/bin/sh
PATH=`getconf PATH`:$PATH awk "$@"
%
ln -s awk nawk
ln -s awk gawk

답변2

그런 경우에는 변수를 사용합니다.

AWK=awk
GREP=grep

그런 다음 운영 체제를 테스트하십시오.

if [ $(uname -s) == "SunOS" ]
then
  AWK=/usr/bin/nawk
  GREP=/usr/xpg4/bin/grep
fi

(redhat, suse, hp-ux, aix에 대해 반복)

그 후에 변수를 사용하십시오

if $GREP -q whatever /some/file
then
   $AWK -F: '{....}' /some/file
fi

이렇게 하면 스크립트가 하나만 있지만 모든 호스트에서 사용할 수 있습니다.

관련 정보