
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
$
コマンドの置き換えだけでなく、コードや$2
呼び出しawk
でも$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}'\`