Em um script bash, como posso ir para um diretório cujo nome está armazenado em uma variável? [duplicado]

3

Estou fazendo um script FileCreator:

#!/bin/bash

echo "Welcome to the file creator! Please type the directory name:"
read dirName

mkdir $dirName

#Now I want to change directory to that new $dirName that will be run from Terminal.

A minha pergunta é agora, como alterar o caminho para este novo diretório dirName que é visível no Terminal. Então, no final, o caminho deve ser: /home/my_user_name/SCRIPTS/dirName quando eu executo este script ...

Por favor, apenas uma sugestão? :)

    
por andrej benedičič 15.01.2017 / 22:08

1 resposta

7

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 executar ls -- -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 comando read . 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 em IFS , 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).

    
por Eliah Kagan 15.01.2017 / 22:33