es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo pasar todos los argumentos de bash a bash -c dentro de la sustitución de comandos?

Estoy tratando de pasar argumentos de script condicionalmente a bash - c, que a su vez es pasado a un comando docker run. El ejemplo a continuación ilustra lo que estoy tratando de hacer.


#!/bin/bash echo "Args: ${@}" docker run ubuntu \ $(if [[ ! -z ${@} ]]; then echo "bash -c ${@}"; fi) docker run ubuntu \ $(if [[ ! -z ${@} ]]; then echo "bash -c \"${@}\""; fi)

Para una llamada ./myscript.sh ls -la, esto me da la siguiente salida.

Args: ls -la
bin
boot
dev
etc
home
lib
lib32
lib64
libx32
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
-la": -c: línea 0: EOF inesperado mientras buscaba una coincidencia de "'
-la": -c: línea 1: error de sintaxis: fin de archivo inesperado

Como puede ver, la primera llamada de docker run funciona, pero ignora la bandera -la que también se ha pasado. Pensé en tratar de encerrar el comando pasado a bash -c, a saber, ls -la, entre comillas escapadas, pero esto no funciona en absoluto.

¿Cómo puedo lograr el comportamiento deseado? ¡Gracias de antemano!

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para pasar condicionalmente los argumentos de un script a bash -c, el cual a su vez se pasa a un comando docker run, puede intentar las siguientes opciones:

    Opción 1:

    #!/bin/bash
    
    echo "Args: ${@}"
    docker run ubuntu \
      $( if [[ ! -z ${@} ]]; then echo "bash -c '$@'"; fi )
    

    Esto debería permitir pasar todos los argumentos del script a bash -c encerrados entre comillas simples. La salida debería verse como algo así:

    Args: ls -la
    total 80
    drwxr-xr-x 1 root root 4096 Mar  9 13:12 .
    drwxr-xr-x 1 root root 4096 Mar  9 13:12 ..
    lrwxrwxrwx 1 root root    7 Jan 28 16:29 bin -> usr/bin
    drwxr-xr-x 2 root root 4096 Apr  7  2020 boot
    ...
    

    Opción 2:

    #!/bin/bash
    
    echo "Args: ${@}"
    docker run -it --rm ubuntu bash -c "${@}"
    

    Esto utiliza la opción -it para ejecutar el contenedor en modo interactivo y la opción --rm para eliminar el contenedor una vez que sale. La opción -c se utiliza para pasar el comando a bash y ${@} se utiliza para pasar todos los argumentos del script. La salida debería verse como algo así:

    Args: ls -la
    total 80
    drwxr-xr-x 1 root root 4096 Mar  9 13:12 .
    drwxr-xr-x 1 root root 4096 Mar  9 13:12 ..
    lrwxrwxrwx 1 root root    7 Jan 28 16:29 bin -> usr/bin
    drwxr-xr-x 2 root root 4096 Apr  7  2020 boot
    ...
    

    Nota: Asegúrese de escapar correctamente cualquier carácter especial que pueda causar problemas al pasar los argumentos del script a bash -c dentro del comando docker run.

Comments are closed.