Tip para permitir indentaciones de las directivas Here Document en shell scripts

por | agosto 6, 2016

En un artículo anterior escribí sobre las posibilidades que nos ofrecía Here Document para embeber código en shell scripts. No obstante si nos fijamos bien hay una pequeña cuestión más que nada estética y es que las líneas que delimitan el HereDoc no pueden estar indentadas en un principio. Como ejemplo el siguiente fragmento:

create_datasource(){
$JBOSS_HOME/bin/jboss-cli.sh --connect <<EOF
  batch
  :take-snapshot()
  /subsystem=datasources/jdbc-driver=\
  "$driver-name":add(driver-name="$driver_name",driver-module-name="$module_name")
  data-source add --jndi-name=java:/jboss/"$ds_jndi_name" --name="$pool_name" \
  --connection-url="$connection_url"--driver-name="$driver_name" \
  --user-name="$user" --password="$password"
  :reload
  run-batch
  exit
EOF
}

El código interior de un Heredoc sí puede indentarse sin problemas, pero si estamos trabajando con scripts algo largos tener unas líneas correctamente indentadas y otras no puede resultar algo confuso y tedioso a la hora de leer.

Para solucionarlo y poder indentar las líneas con las directivas iniciaremos el HereDoc con <<-EOF, por ejemplo:

create_datasource(){
  $JBOSS_HOME/bin/jboss-cli.sh --connect <<-EOF
  batch
  :take-snapshot()
  /subsystem=datasources/jdbc-driver=\
  "$driver-name":add(driver-name="$driver_name",driver-module-name="$module_name")
  data-source add --jndi-name=java:/jboss/"$ds_jndi_name" --name="$pool_name" \
  --connection-url="$connection_url"--driver-name="$driver_name" \
  --user-name="$user" --password="$password"
  :reload
  run-batch
  exit
  EOF
}

Como vemos, ahora aparecerá perfectamente alineado e indentado todo el código donde debe de estar.