2017-01-17 4 views
0

인용 부호없이 Distro 이름을 얻으려고합니다.Bash가 서브 쉘로 잘못 대체 됨

cat /etc/*-release | grep "NAME=.*" -o | cut -d "=" -f2 | head -n1

결과 :

echo ${$(cat /etc/*-release | grep "NAME=.*" -o | cut -d "=" -f2 | head -n1)/\"} 

을 나는 생각했다 : 이제 "CentOS Linux"

는 쉘 대체를 사용하여, 나는 인용 내이 서브 쉘에서 명령을 배치 표시 제거하려 나는 \"을 사용하여 인용문을 탈출 한 다음 마지막으로 /을 생략함으로써 단순히 인용 부호를 지울 수 있습니다.

편집 : 나는이 방법이 awk 일 수 있음을 알고 있지만 어떻게해야할지 모르겠다.

CentOS Linux release 7.2.1511 (Core) 
NAME="CentOS Linux" 
VERSION="7 (Core)" 
ID="centos" 
ID_LIKE="rhel fedora" 
VERSION_ID="7" 
PRETTY_NAME="CentOS Linux 7 (Core)" 
ANSI_COLOR="0;31" 
CPE_NAME="cpe:/o:centos:centos:7" 
HOME_URL="https://www.centos.org/" 
BUG_REPORT_URL="https://bugs.centos.org/" 

CENTOS_MANTISBT_PROJECT="CentOS-7" 
CENTOS_MANTISBT_PROJECT_VERSION="7" 
REDHAT_SUPPORT_PRODUCT="centos" 
REDHAT_SUPPORT_PRODUCT_VERSION="7" 

CentOS Linux release 7.2.1511 (Core) 
CentOS Linux release 7.2.1511 (Core) 

예상 출력 :에 CentOS 리눅스는

+0

@Inian 샘플 파일이 없으며 이들은'/ etc /'에있다. 데비안 및 CentOS에서 최소한 – rhillhouse

답변

1

NAME 변수 다음 OS 이름을 받고, awk 사용.

awk -F"=" '$1=="NAME"{gsub(/"/, "", $2);print $2; exit}' /etc/os-release 
CentOS Linux 
2

/etc/os-release 쉘 할당 문의 간단한 설정으로 나타납니다;

편집 : 출력 cat /etc/*-release의 당신은 단순히 출력 (모든 현재 쉘에서 변수를 덮어 잠재적으로 방지하기 위해 서브 쉘을 사용) $NAME의 값 소스 수 있습니다 신뢰의 수준에 따라이 될 수있는 보안 위험을

(. /etc/os-release; echo "$NAME") 

을 그 /etc/os-release에는 어떤 이유로 든 다른 실행 코드가 포함될 수 있습니다.

실제로 필요한 경우 간단한 문자열로 사용하려는 정보가 포함 된 /etc/centos-release을 사용하기 만하면됩니다. (당신은. os-release이 더 배포판에 얽매이지 버전으로 나타납니다. 스크립트는 물론, CentOS는 상자에서 실행한다고 가정되지 않을 수 있습니다)

+1

파일이 변경 될 수있는 경우'(. $ (grep -l "^ NAME ="/ etc/* ease); echo "$ NAME")'을 사용하여 '^ NAME ='. – fedorqui

0

거의 해결책이 있습니다. "CentOS Linux"의 따옴표는 릴리스 파일의 일부이며, 서브 쉘을 사용하면 도움이되지 않습니다.

cat /etc/*-release | grep "NAME=.*" -o | cut -d "=" -f2 | head -n1 | cut -d '"' -f2 

당신은

sed -n '/^NAME=/ {s/NAME="\(.*\)".*/\1/p;q}' /etc/*-release 

설명과 sed를 사용하여 동일한 작업을 수행 할 수 있습니다 : 당신은 구분 기호로 큰 따옴표로 cut를 사용할 수있는 p과 더불어, 찾아위한 인쇄 라인이 질문 만에 sed에게 행은 NAME=으로 시작하고 따옴표 사이의 부분을 일치시키고 첫 번째 줄 다음에 종료하려면 NAME=이됩니다.