쉘 스크립트에서 리눅스로 템플릿? 구성 파일을 템플릿으로 사용 (예 : Apache

내가 성취하고 싶은 것은 :

1.) $ version $ path와 같은 변수를 사용하여 구성 파일을 템플릿으로 사용 (예 : Apache 구성)

2.) 템플릿의 변수를 “채우고”생성 된 파일을 디스크에 쓰는 쉘 스크립트가 있어야합니다.

쉘 스크립트로 가능합니까? 이 명령이나 좋은 링크를 얻을 수있는 명령 / 도구의 이름을 지정할 수 있다면 매우 감사 할 것입니다.



답변

이것은 매우 가능합니다. 이것을 구현하는 매우 간단한 방법은 템플릿 파일이 실제로 스크립트이고 다음과 같은 쉘 변수를 사용하는 것입니다

#! /bin/bash
version="1.2.3"
path="/foo/bar/baz"
cat > /tmp/destfile <<-EOF
here is some config for version $version which should
also reference this path $path
EOF

version=$1및 을 지정하여 명령 줄에서이 설정을 구성 path=$2할 수 있으므로 다음과 같이 실행할 수 있습니다 bash script /foo/bar/baz 1.2.3. 는 -EOF가 라인을 무시하기 전에 공백이 발생하기 전에, 일반 사용 <<EOF당신이 그 행동을하지 않으려면.

이 작업을 수행하는 또 다른 방법은 sed의 검색 및 교체 기능을 사용하는 것입니다

#! /bin/bash
version="1.2.3"
path="/foo/bar/baz"
sed -e "s/VERSION/$version/g" -e "s/PATH/$path/" /path/to/templatefile > /tmp/destfile

VERSION 및 PATH 문자열의 각 인스턴스를 대체합니다. 이러한 문자열이 템플릿 파일에있는 다른 이유가있는 경우 검색 및 교체를 VERSION 또는 % VERSION % 또는 실수로 트리거 할 가능성이 적은 것으로 만들 수 있습니다.


답변

이외의 도구는 필요하지 않습니다 /bin/sh. 양식의 템플릿 파일이 주어짐

Version: ${version}
Path: ${path}

또는 혼합 쉘 코드가 포함 된 경우에도

Version: ${version}
Path: ${path}
Cost: ${cost}\$
$(i=1; for w in one two three four; do echo Param${i}: ${w}; i=$(expr $i + 1); done)

셸 파싱 가능한 구성 파일

version="1.2.3-r42"
path="/some/place/under/the/rainbow/where/files/dance/in/happiness"
cost="42"

이것을 확장하는 것은 간단한 일입니다.

Version: 1.2.3-r42
Path: /some/place/under/the/rainbow/where/files/dance/in/happiness
Cost: 42$
Param1: one
Param2: two
Param3: three
Param4: four

실제로 쉘 변수의 구성 파일 config_file경로와의 템플릿 파일 경로 template_file는 다음과 같습니다.

. ${config_file}
template="$(cat ${template_file})"
eval "echo \"${template}\""

이것은 아마도 완전한 쉘 스크립트를 템플릿 파일 (@mtinberg의 솔루션)로 사용하는 것보다 더 좋습니다.

완전한 순진한 템플릿 확장 프로그램 :

#!/bin/sh

PROG=$(basename $0)

usage()
{
    echo "${PROG} <template-file> [ <config-file> ]"
}

expand()
{
    local template="$(cat $1)"
    eval "echo \"${template}\""
}

case $# in
    1) expand "$1";;
    2) . "$2"; expand "$1";;
    *) usage; exit 0;;
esac

확장을 표준 출력으로 출력합니다. 표준 출력을 파일로 리디렉션하거나 원하는 방식으로 원하는 출력 파일을 생성하기 위해 위의 방식으로 수정하십시오.

주의 사항 : 파일에 이스케이프되지 않은 큰 따옴표 ( ")가 포함 된 경우 템플릿 파일 확장이 작동하지 않습니다 . 보안상의 이유로 템플릿 파일이 외부 엔터티에 의해 생성되는 경우 명백한 무결성 검사를 포함하거나 셸 이스케이프 변환을 수행하는 것이 좋습니다.


답변

Linux CLI에서 간단하게 수행하는 가장 쉬운 방법은 envsubst환경 변수 를 사용하는 것 입니다.

예제 템플릿 파일 apache.tmpl:

<VirtualHost *:${PORT}>
    ServerName ${SERVER_NAME}
    ServerAlias ${SERVER_ALIAS}
    DocumentRoot "${DOCUMENT_ROOT}"
</VirtualHost>

실행 envsubst하고 결과를 새 파일로 출력하십시오 my_apache_site.conf.

export PORT="443"
export SERVER_NAME="example.com"
export SERVER_ALIAS="www.example.com"
export DOCUMENT_ROOT="/var/www/html/"
envsubst < apache.tmpl > my_apache_site.conf

산출:

<VirtualHost *:443>
    ServerName example.com
    ServerAlias www.example.com
    DocumentRoot "/var/www/html/"
</VirtualHost>

답변

아마도 Puppet 또는 Chef 같은 구성 관리 시스템을 살펴 봐야 합니다. 이들은 쉽게 위하고 무엇을 설명 할 수있는 훨씬 더.


답변

새 파일을 생성하는 쉘 코드가 아닌 가볍고 실제 템플릿을 원한다면 일반적인 선택은 sed& awk또는 perl입니다. 하나의 링크는 다음과 같습니다. http://savvyadmin.com/generate-text-from-templates-scripts-and-csv-data/

나는 perl, tcl, python, ruby ​​또는 그 클래스의 다른 언어와 같은 실제 언어를 사용합니다. 스크립팅을 위해 구축 된 것입니다. 그들은 모두 훌륭하고 간단한 템플릿 도구와 Google에 많은 예제를 가지고 있습니다.


답변

나는 그것을 위해 shtpl 을 사용 합니다. (비공개 프로젝트, 즉 널리 사용되지는 않습니다. 그러나 어쨌든 테스트하고 싶을 수도 있습니다)

예를 들어 csv 파일에서 / etc / network / interfaces를 생성하려면 다음과 같이하십시오.

CSV 파일 내용 (여기서는 test.csv) :

eth0;10.1.0.10;255.255.0.0;10.1.0.1
eth1;192.168.0.10; 255.255.255.0;192.168.0.1

템플릿 (여기에서 interfaces.tpl) :

#% IFS=';'
#% while read "Val1" "Val2" "Val3" "Val4"; do
auto $Val1
iface $Val1 inet static
  address $Val2
  netmask $Val3
  gateway $Val4

#% done < "$CSVFILE"

명령:

$ CSVFILE=test.csv sh -c "$( shtpl interfaces.tpl )"

결과:

auto eth0
iface eth0 inet static
  address 10.1.0.10
  netmask 255.255.0.0
  gateway 10.1.0.1

auto eth1
iface eth1 inet static
  address 192.168.0.10
  netmask  255.255.255.0
  gateway 192.168.0.1

즐겨!


답변

사용자가 큰 따옴표를 수동으로 이스케이프 처리 할 필요가 없도록 FooF의 답변을 개선했습니다.

#!/bin/bash
template="$(cat $1)"
template=$(sed 's/\([^\\]\)"/\1\\"/g; s/^"/\\"/g' <<< "$template")
eval "echo \"${template}\""