![다양한 *nix 버전에서 실행될 수 있도록 셸 스크립트를 업데이트해야 합니다.](https://rvso.com/image/97262/%EB%8B%A4%EC%96%91%ED%95%9C%20*nix%20%EB%B2%84%EC%A0%84%EC%97%90%EC%84%9C%20%EC%8B%A4%ED%96%89%EB%90%A0%20%EC%88%98%20%EC%9E%88%EB%8F%84%EB%A1%9D%20%EC%85%B8%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EB%A5%BC%20%EC%97%85%EB%8D%B0%EC%9D%B4%ED%8A%B8%ED%95%B4%EC%95%BC%20%ED%95%A9%EB%8B%88%EB%8B%A4..png)
다양한 *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
이렇게 하면 스크립트가 하나만 있지만 모든 호스트에서 사용할 수 있습니다.