bash ou Ksh aspas e comando exec [duplicado]

1

ao criar um script que estou enfrentando atualmente como um problema "estranho" que até agora não consegui corrigir.

typeset -r SERVICE=\"ldap://localhost:10389\ ldaps://solsrv02.internal.vbox:10689\ ldaps://solsrv02.prod.internal.vbox:10689\"
SLAPD="/usr/lib/slapd -u ${LDAPUSR} -g ${LDAPGRP} -h ${SERVICE} -F ${CONF_DIR}"

Atualmente, a atribuição da variável é como acima e quando faço eco do SLAPD, funciona como um encanto. mas quando eu executo o comando: Saída de eco

 /usr/lib/slapd -u openldap -g openldap -h "ldap://localhost:10389 ldaps://solsrv02.internal.vbox:10689 ldaps://solsrv02.prod.internal.vbox:10689" -F /etc/openldap/standalone

Saída de depuração

+ [[ ! -d /var/openldap/run ]]
+ /bin/rm -f /var/openldap/run/slapd.pid
+ /usr/lib/slapd -u openldap -g openldap -h '"ldap://localhost:10389' ldaps://solsrv02.internal.vbox:10689 'ldaps://solsrv02.prod.internal.vbox:10689"' -F /etc/openldap/standalone

Então, meu problema agora é que a linha de comando openldap me obriga a ter -h "URLs" e adicionar à variável que assume a variável como 3 parâmetros em vez de um único como eu desejo.

Eu tentei retroceder as aspas, mas ela se expande para três aspas simples. Se eu apenas copiar a saída do eco e colá-lo no script, ele funciona. mas isso tem o lado negativo que não posso personalizar usando variáveis.

todas as variáveis foram definidas com typeset -r

UPDATE 1

Com base na resposta dada pelo cas, atualizei meu código, mas ainda enfrento o mesmo problema:

   #!/usr/bin/bash
echo $SHELL
typeset -r SLAPD=/usr/lib/slapd
typeset -r LDAPUSR=openldap
typeset -r LDAPGRP=openldap
typeset -r VARRUNDIR=/var/openldap/run
typeset -r PIDFILE=${VARRUNDIR}/slapd.pid
typeset -r CONF_DIR=/etc/openldap/standalone
typeset -r SERVICE=(ldap://localhost:10389 ldaps://solsrv02.internal.vbox:10689 ldaps://solsrv02.prod.internal.vbox:10689)
SLAPARGS=" -u ${LDAPUSR}"
SLAPARGS+=" -g ${LDAPGRP}"
SLAPARGS+=" -F ${CONF_DIR}"
SLAPARGS+=" -h "
SIZE=${#SERVICE[@]}

#for i in {1..${#SERVICE[@]}$}; do
SLAPARGS+="'"
for ((i=0;i<$SIZE;i=$i+1)); do
        SLAPARGS+="${SERVICE[$i]} "
done
SLAPARGS+="'"
[[ ! -d ${CONF_DIR} ]] && exit $SMF_EXIT_ERR_CONFIG

echo "$SLAPD $SLAPARGS"
set -x
$SLAPD $SLAPARGS 2>&1

a saída é esta:

/usr/bin/bash
/usr/lib/slapd  -u openldap -g openldap -F /etc/openldap/standalone -h 'ldap://localhost:10389 ldaps://solsrv02.internal.vbox:10689 ldaps://solsrv02.prod.internal.vbox:10689 '
+ [[ ! -d /var/openldap/run ]]
+ /bin/rm -f /var/openldap/run/slapd.pid
+ /usr/lib/slapd -u openldap -g openldap -F /etc/openldap/standalone -h ''\''ldap://localhost:10389' ldaps://solsrv02.internal.vbox:10689 ldaps://solsrv02.prod.internal.vbox:10689 ''\'''

Versão do Bash é 4.1.17

    
por BitsOfNix 04.04.2016 / 10:57

1 resposta

2

Tente algo assim:

SLAPD='/usr/bin/slapd'

SERVICE='ldap://localhost:10389 ldaps://solsrv02.internal.vbox:10689  ldaps://solsrv02.prod.internal.vbox:10689'

SLAPDARGS="-u '${LDAPUSR}'"
SLAPDARGS+=" -g '${LDAPGRP}'"
SLAPDARGS+=" -h '${SERVICE}'"
SLAPDARGS+=" -F '${CONFDIR}'"

$SLAPD $SLAPDARGS

Para que você possa ver o que isso faz (quando executado depois que $LDAPUSR , $LDAPGRP e $CONFDIR foram definidos adequadamente):

$ echo $SLAPD $SLAPDARGS 
/usr/bin/slapd -u 'ldap' -g 'ldap' -h 'ldap://localhost:10389 ldaps://solsrv02.internal.vbox:10689 ldaps://solsrv02.prod.internal.vbox:10689' -F '/etc/ldap'

Se o seu shell não for compatível com += , use algo assim:

SLAPDARGS="-u '${LDAPUSR}'"
SLAPDARGS="${SLAPDARGS} -g '${LDAPGRP}'"
SLAPDARGS="${SLAPDARGS} -h '${SERVICE}'"
SLAPDARGS="${SLAPDARGS} -F '${CONFDIR}'"

A chave é usar aspas simples quando você NÃO quer interpolação e expansão global, etc, e nenhuma aspas ou aspas duplas quando você quiser. Por exemplo, você NÃO deseja nenhuma aspas em torno de $SLAPDARGS quando estiver usando na linha de comando que executa $SLAPD , caso contrário, elas serão passadas como um único argumento para slapd .

Outra alternativa é usar uma matriz para SLAPDARGS em vez de uma string simples.

BTW, se você quiser manter os comprimentos de linha de script abaixo de 80 colunas, $SERVICE pode ser incrementado da mesma forma que $SLAPDARGS foi - e também pode ser definido como uma matriz em vez de uma string simples.

    
por 04.04.2016 / 11:43