No hay división de palabras (como en la función que divide las variables en expansiones sin comillas) en ese código, ya $myvarque no está sin comillas.
Sin embargo, existe una vulnerabilidad de inyección de comandos que $myvarse expande antes de pasar a bash. ¡Entonces su contenido se interpreta como código bash!
Los espacios allí causarán que se pasen varios argumentos cd, no debido a la división de palabras , sino porque se analizarán como varios tokens en la sintaxis del shell. ¡Con un valor de bye;reboot, eso se reiniciará! ¹
Aquí te gustaría:
sudo bash -c 'cd -P -- "$1"' bash "$myvar"
(donde pasa el contenido de $myvarcomo el primer argumento de esa secuencia de comandos en línea; tenga en cuenta cómo ambos $myvary $1fueron citados por su respectivo shell para evitar la división de palabras IFS (y globbing)).
O:
sudo MYVAR="$myvar" bash -c 'cd -P -- "$MYVAR"'
(donde pasa el contenido de $myvaren una variable de entorno).
Por supuesto, no logrará nada útil ejecutando solo cd en ese script en línea (aparte de verificar si rootpuede hacerlo cdallí). Presumiblemente, desea que ese script esté cdallí y luego haga algo más como:
sudo bash -c 'cd -P -- "$1" && do-something' bash "$myvar"
Si la intención era usar sudopara poder cdingresar a un directorio al que de otra manera no tendría acceso, entonces eso realmente no puede funcionar.
sudo sh -c 'cd -P -- "$1" && exec bash' sh "$myvar"
iniciará un interactivo bashcon su directorio actual en $myvar. Pero ese shell se ejecutará como root.
Podrías hacerlo:
sudo sh -c 'cd -P -- "$1" && exec sudo -u "$SUDO_USER" bash' sh "$myvar"
Para obtener una interacción no privilegiada bashcon el directorio actual $myvar, pero si no tenía los permisos para cdingresar a ese directorio en primer lugar, no podrá hacer nada en ese directorio, incluso si es su directorio de trabajo actual.
$ myvar=/var/spool/cron/crontabs
$ sudo sh -c 'cd -P -- "$1" && exec sudo -u "$SUDO_USER" bash' sh "$myvar"
bash-4.4$ ls
ls: cannot open directory '.': Permission denied
Una excepción sería si tiene permiso de búsqueda para el directorio en sí pero no para uno de los componentes del directorio de su ruta:
$ myvar=1/2
$ mkdir -p "$myvar"
$ chmod 0 1
$ cd 1/2
cd: permission denied: 1/2
$ sudo sh -c 'cd -P -- "$1" && exec sudo -u "$SUDO_USER" bash' sh "$myvar"
bash-4.4$ pwd
/home/stephane/1/2
bash-4.4$ mkdir 3
bash-4.4$ ls
3
bash-4.4$ cd "$PWD"
bash: cd: /home/stephane/1/2: Permission denied
¹ estrictamente hablando, para valores de $myvarlike $(seq 10)(literalmente), habría división de palabras, por supuesto, al expandir la sustitución de ese comando por el bash shell iniciado comoroot
cdúnico tiene efecto dentro delbash -ccaparazón.