로케일 종속 bash 스크립트: 로케일을 올바르게 보장하는 방법은 무엇입니까?

로케일 종속 bash 스크립트: 로케일을 올바르게 보장하는 방법은 무엇입니까?

ssh(또는 다른 ssh 유사 클라이언트)를 통해 액세스하는 다른 컴퓨터의 bash 스크립트에서 이상한 오류가 발생했습니다.

기본적으로 호스팅되는 컴퓨터의 IP 주소를 구체적으로 표시하는 메뉴입니다.

중요한 부분은 다음 코드입니다.

#!/bin/bash

function int-ips { /sbin/ifconfig |grep -B1 "inet addr" |awk '{ if ( $1 == "inet" ) { print $2 } else if ( $2 == "Link" ) { printf "%s:" ,$1 } }' |awk -F: '{ print $1 ": " $3 }'; }

echo $(int-ips)

(저는 위의 함수를 복사해서 붙여넣었습니다.http://www.if-not-true-then-false.com/2010/linux-get-ip-address/)

Mac OS X의 F19에서는 훌륭하게 실행됩니다. 그런 다음 다른 동료가 자신의 OS X에서 이를 시도했지만 놀랍게도 아무 것도 인쇄되지 않았습니다. 스크립트는 여전히 동일한 시스템에서 실행 중이며 다른 클라이언트에서 SSH를 통해 액세스됩니다.

이것이 로케일 문제라는 것을 알아내는 데 시간이 좀 걸렸습니다. 마지막 컴퓨터의 언어는 영어가 아니었고 IP 주소를 검색하는 데 사용된 함수는 "grep Link"를 사용했으며 "link"라는 단어는 우연히 ifconfig로 번역되었습니다. 적어도 내 동료가 사용하고 있는 다른 로케일과 함께 사용하세요.

끔찍한 오류 소스가 있다는 것을 깨닫고 이 로케일 종속성 문제로부터 자신을 적절하게 보호하는 방법을 알고 싶었습니다.
예를 들어, 입력의 파일 형식을 알아내기 위해 "file" 명령을 사용할 것이고, 결과를 분석하기 위해 아마도 "grep" 등을 사용할 것이라는 것을 알고 있습니다.

내 솔루션:

내 스크립트 시작 부분에 다음을 추가하십시오.

export LANG=C
export LC_ALL=C

(또는 C 대신 en_US.utf8일 수도 있습니다)

나중에 할 수 있는 더 깨끗한 솔루션은 다음과 같습니다.

  1. 현재 LANG 및 LC_ALL 저장
  2. 내보내기 LANG=C; 내보내기 LC_ALL=C
  3. 내 로케일 관련 코드 실행
  4. 1)에 저장된 사용자 로캘 복원

내 질문:

A) 이 수정이 가능합니까? 내 말은, 내가 보지 못하는 이 접근 방식을 사용할 때 발생할 수 있는 몇 가지 위험에 대해 경고해 줄 수 있는 숙련된 bash/nix 코더가 있습니까? (nix/nux를 더 깊이 파고들수록 나는 더 확실해집니다.아무것도 없다:피)

B) 이 모든 작업을 수행하는 더 깨끗하고 우아한 방법이 있습니까?

PS 참고이지만 관련이 없습니다. IMHO:
스크립트를 호스팅하는 머신은 Centos 6.4가 설치된 가상 머신에 있습니다.
VM에 액세스하는 시스템은 Fedora 19, Mac OS X(ssh 터미널을 통해) 또는 Windows 7(Putty를 통해)에 있습니다.

답변1

명령 바로 앞에 환경 변수를 추가하면 명령 기간만 차지하게 되므로 최종 애플리케이션에 적합할 수도 있고 적합하지 않을 수도 있습니다.

LC_MESSAGES=C /sbin/ifconfig | grep ...

관련 정보