Linux 명령줄을 파일에 추가하는 방법은 무엇입니까?

Linux 명령줄을 파일에 추가하는 방법은 무엇입니까?

Vagrantfile을 생성하는 bash 스크립트를 작성 중입니다. Vagrantfile을 생성하기 vagrant up 위해 bash 스크립트를 사용하는 이유 는 동료들이 실행하기 전에 단일 스크립트를 사용하여 환경을 설정할 수 있도록 하기 위함입니다.

예를 들어( setup-vagrant-host.sh)

#!/bin/bash
.
.
.
some pre requisites steps
.
.
.
# Generate Vagrantfile
cat <<EOL > Vagrantfile
    Vagrant.configure("2") do |config|
    config.vm.define "vagrant-host"
    config.vm.provision "shell", inline: <<-SHELL
        sudo su
        apt update
        ipaddress=`hostname -I | awk '{print $2}'`
        echo "*** IP address is $ipaddress ***"
    SHELL
    end
EOL
vagrant up

위의 스크립트를 실행하면 hostname -I | awk '{print $2}'항상 Vagrantfile에 추가되지 않고 실행됩니다. 이 작업을 올바르게 수행하고 있는지 모르겠습니다. 더 좋은 방법을 제안해 주세요...

영어가 모국어가 아니므로 잘못된 문법은 잊어주세요. 감사합니다.

답변1

이 문서의 확장은 확장 자체가 참조되거나 문서 자체가 참조되지 않는 한 셸에 의해 실행됩니다.

예제의 문서에서 쉘이 확장하려고 시도하는 명령 대체 및 기타 다양한 변수를 인용합니다.

cat <<EOL > Vagrantfile
    Vagrant.configure("2") do |config|
    config.vm.define "vagrant-host"
    config.vm.provision "shell", inline: <<-SHELL
        sudo su
        apt update
        ipaddress=\\\$(hostname -I | awk '{print \\\$2}')
        echo "*** IP address is \\\$ipaddress ***"
    SHELL
    end
EOL

$명령 대체뿐만 아니라 코드 $2awk호출에서도 $ipaddress인용 해야 합니다 echo. 실제로 이 문자열 \\\은 여기에 포함된 문서의 일부이기 때문에 실제로 큰따옴표를 사용해야 합니다 () SHELL. 각각은 "작성 시 " \\\$로 대체됩니다 .\$Vagrantfile

당신이 정말로 그렇지 않다면생각하다쉘을 사용하여 이 문서의 특정 변수를 확장하면 일반적으로 이 문서 전체를 더 쉽게 참조할 수 있습니다. 이는 초기 문서 구분 기호 문자열을 참조하여 수행됩니다.

cat <<'EOL' > Vagrantfile
    Vagrant.configure("2") do |config|
    config.vm.define "vagrant-host"
    config.vm.provision "shell", inline: <<-'SHELL'
        sudo su
        apt update
        ipaddress=`hostname -I | awk '{print $2}'`
        echo "*** IP address is $ipaddress ***"
    SHELL
    end
EOL

여기서는 여기에 포함된 문서와 외부 여기 문서를 참조하도록 선택합니다.

<<-이 코드가 사용되는 방법과 위치에 따라 첫 번째 문서와 여기에 포함된 문서가 모두 탭으로 들여쓰기되어 있고 여기 문서가 모두 ( <<-'EOL'<<-'START') 로 시작되는지 확인할 수 있습니다 . 이렇게 하면 여기에 포함된 문서가 올바르게 구문 분석될 수 있습니다(한 번 생성되면 끝이 SHELL먼저 와야 함).Vagrantfile

이에 대해서는 제가 댓글을 달지 않았으니 참고해주세요콘텐츠여기에 있는 문서가 달성하려는 목표의 측면에서. 예를 들어 sudo su말이 되는지 는 모르겠습니다 .

답변2

구분된 문서에서 백틱을 이스케이프하려면 백슬래시를 사용해야 합니다.

        ipaddress=\`hostname -I | awk '{print $2}'\`

관련 정보