
Eu escrevi um arquivo ksh de teste para cd em uma pasta e fiz uma listagem. A seguir está escrito:
`cd "their_file/"`;
`pwd`;
`ls -l`;
Me dá a seguinte saída:
./test.ksh: line 2: /home/user/final: Is a directory
./test.ksh: line 3: total: command not found
Esta é minha senha:
/home/usuário/final
Como faço para corrigir isso? Eu acho que está executando a instrução cd e depois saindo da instrução. Estou usando a máquina Fedora.
Responder1
Os crases em torno de cada comando em seu script farão com que o shell pegue a saída do comando e executequecomo um comando.
Usar crases em torno de um comando equivale a colocar o comando dentro $( ... )
(esta é a sintaxe preferida para capturar a saída de um comando).
A mensagem de erro /home/user/final: Is a directory
vem da ksh
tentativa de executar o resultado de pwd
como um comando e, da mesma forma, total: command not found
da tentativa de executar o resultado de ls -l
.
Remova os crases. Remova também o ponto e vírgula ( ;
). Eles só serão necessários se você quiser colocar dois comandos na mesma linha:
cd dir; pwd
Seu script deve ser parecido com
#!/bin/sh
cd "their_file"
pwd
ls -l
Observe que isso ainda será executado pwd
e ls -l
se cd
falhar. Para sair do script se cd
falhar:
#!/bin/sh
cd "their_file" || exit 1
pwd
ls -l
Isso usa o fato de que cd
retorna um valor diferente de zerostatus de saídase falhar. O ||
(lógicoou) na frente de exit 1
significa que o script executará a exit
instrução se cd
retornar "falso" (que em scripts shell é o que significa um status de saída diferente de zero).
A razão pela qual você obtém /home/user/final: Is a directory
enão /home/user/final/their_file: Is a directory
é porque o cd
é executado em umsub-shell(que é o que acontece quando você coloca crases ou dentro de $( ... )
). Como é executado em um subshell, a alteração real do diretório de trabalho não é refletida no shell pai (seu script).
Pelo mesmo motivo, você notará que quando o script terminar de ser executado, você ainda estará no mesmo diretório de quando invocou o script, e não no their_file
diretório.
Para obter mais informações sobre esse assunto específico, consulte "por que a função cd no script não funciona" e "Script para alterar o diretório atual (cd, pwd)" (e outras questões semelhantes).