
Escribí un archivo ksh de prueba en un cd en una carpeta y hice una lista. Se escribe lo siguiente:
`cd "their_file/"`;
`pwd`;
`ls -l`;
Me da el siguiente resultado:
./test.ksh: line 2: /home/user/final: Is a directory
./test.ksh: line 3: total: command not found
Esta es mi contraseña:
/inicio/usuario/final
¿Cómo puedo solucionar esto? Supongo que está ejecutando la declaración cd y luego saliendo de la declaración. Estoy usando la máquina Fedora.
Respuesta1
Las comillas invertidas alrededor de cada comando en su secuencia de comandos harán que el shell tome la salida del comando y lo ejecute.esocomo una orden.
Usar comillas invertidas alrededor de un comando equivale a poner el comando dentro $( ... )
(esta es la sintaxis preferida para capturar la salida de un comando).
El mensaje de error /home/user/final: Is a directory
proviene de ksh
intentar ejecutar el resultado de pwd
como un comando y, de la misma manera, total: command not found
al intentar ejecutar el resultado de ls -l
.
Retire las garrapatas invertidas. Elimine también el punto y coma ( ;
). Estos sólo son necesarios si deseas poner dos comandos en la misma línea:
cd dir; pwd
Su guión debería verse así
#!/bin/sh
cd "their_file"
pwd
ls -l
Tenga en cuenta que esto aún se ejecutará pwd
si ls -l
falla cd
. Para salir del script si cd
falla:
#!/bin/sh
cd "their_file" || exit 1
pwd
ls -l
Esto utiliza el hecho de que cd
devuelve un valor distinto de cero.estado de salidasi falla. El ||
(lógicoo) delante de exit 1
significa que el script continuará ejecutando la exit
declaración si cd
devuelve "falso" (que en los scripts de shell es lo que significa un estado de salida distinto de cero).
La razón por la que obtienes /home/user/final: Is a directory
yno /home/user/final/their_file: Is a directory
es porque cd
se ejecuta en unsubcapa(que es lo que sucede cuando lo pones entre comillas invertidas o dentro $( ... )
). Dado que se ejecuta en un subshell, el cambio real del directorio de trabajo no se refleja en el shell principal (su script).
Por la misma razón, notará que cuando su secuencia de comandos haya terminado de ejecutarse, seguirá estando en el mismo directorio que cuando invocó la secuencia de comandos, y no en el their_file
directorio.
Para obtener más información sobre este tema en particular, consulte "por qué la función cd en el script no funciona" y "Script para cambiar el directorio actual (cd, pwd)" (y otras preguntas similares).