O comando cd
muda em qual diretório você está . Execute help cd
para detalhes.
Se dirName
for uma variável que contém o nome do diretório você quer ir, então
cd -- "$dirName"
vai lá. Por exemplo, se você começar em /home/my_user_name/SCRIPTS
e a variável dirName
contiver o texto foo
, esse comando levará você para /home/my_user_name/SCRIPTS/foo
.
Se você quiser que dirName
seja interpretado como um caminho relativo em /home/my_user_name/SCRIPTS
, independentemente de onde o usuário executa seu script, use:
cd -- "/home/my_user_name/SCRIPTS/$dirName"
Você deve ter notado o argumento principal --
e o uso da cotação :
-
Em um script, ao passar a entrada do usuário como argumentos para um comando que aceite options começando com
-
ou--
, geralmente é uma boa idéia passar a opção--
primeiro. A maioria dos comandos que aceitam argumentos de nome de arquivo suportam essa sintaxe (você deve sempre verificar, no entanto). Isso significa que todos os argumentos subseqüentes devem ser interpretados como nomes de arquivos, e não como opções.Para entender isso, tente executar
ls -l
e tente executarls -- -l
. Você geralmente não precisa usar o argumento--
quando estiver digitando comandos manualmente. Mas em um script que transmite o valor da entrada não-analizada para um comando, ele é usado com frequência. -
Em ambos os comandos, usei as aspas duplas (
"
"
). Geralmente, isso é o que você deseja ao expandir uma variável que contém um nome de arquivo.Como se você não usasse nenhuma cotação, mas diferentemente das citações simples (
'
'
), as aspas duplas permitem a expansão dos parâmetros . Portanto, eles não impedem que$dirName
seja expandido para o valor que foi atribuído a ele pelo comandoread
. No entanto, ao contrário de não usar aspas, mas como aspas simples, as aspas duplas evitam divisão de palavras . Dessa forma, se a variável contiver caracteres em branco (ou caracteres presentes emIFS
, if que tenha sido definido ), ele ainda funcionará corretamente.Veja também 3.1.2 Citando no Bash Reference Manual .
Eu também recomendo usar aspas duplas no seu comando mkdir
e, provavelmente, também --
:
mkdir -- "$dirName"
Observe, no entanto, que a alteração do diretório atual em um script de shell não causa o processo chamado o diretório atual> a ser alterado. Isso ocorre por design (e mantém na maioria, senão em todos os sistemas operacionais, incluindo o Windows). Quando um programa executa outro programa, ele não espera que o seu próprio diretório atual seja alterado.
Todo programa tem seu próprio ambiente e seu próprio diretório atual. Quando você inicia um novo programa, ele herda isso do programa que o iniciou, mas possui sua própria cópia. Quando um processo filho altera seu diretório atual, isso não é refletido no processo pai.
Geralmente, quando você deseja alterar o diretório do chamador, a abordagem correta é reconsiderar seu design. Você realmente precisa disso?
Basicamente, a única situação em que é razoável alterar o diretório para o chamador é quando o script é realmente apenas uma lista de comandos que seriam executados diretamente pelo chamador. Quando esse é o caso, você pode fornecer o script em vez de executá-lo .Por exemplo, suponha que você esteja atualmente executando seu script com o comando:./my_script
Então você pode fornecer com:
. ./my_script
Esta sintaxe alternativa também é suportada:
source ./my_script
O shell Bash suporta tanto o .
como source
builtins , e eles são equivalentes. (Execute help .
ou help source
para detalhes.)
Isso faz com que todos os comandos do seu script sejam executados no shell atual , em vez de um novo shell (que é o que acontece quando você realmente executa um script de shell).