Os scripts de shell devem funcionar em caminhos absolutos ou relativos?

1

Eu estou no processo de converter alguns scripts em lote em shell scripts. Os scripts em lote possuem comandos cd, mas ainda usam caminhos absolutos.

foo.bat:

pushd
cd C:\some\directory
copy C:\some\directory\foo.txt C:\some\other\directory
popd

Eu acredito que o cd neste script é redundante, pois o arquivo que está sendo copiado está sendo chamado usando caminhos absolutos. Eu preciso converter isso em um script de shell. Eu tenho as duas opções a seguir:

test1.sh:

cp /some/directory/foo.txt /some/other/directory

test2.sh:

cd /some/directory
cp foo.txt /some/other/directory

Este primeiro usa apenas cp com caminhos absolutos e o segundo usa cd e caminhos relativos.

Minha pergunta é: Qual desses dois exemplos é a melhor prática em termos de usar caminhos em scripts de shell?

Como pergunta secundária, o pushd / popd é necessário em algum desses exemplos?

    
por chronos 02.11.2016 / 22:35

2 respostas

0

Tanto quanto eu experimentei, depende principalmente de suas necessidades e preferências
Você encontrará muitos documentos em que isso é deixado para o usuário. Isso é o que eu notei:

  • os caminhos absolutos são mais claros: quem terá que manter / modificar seu script (você ou outras pessoas) poderá saber todas as vezes quais diretórios estão envolvidos;
  • com caminhos absolutos, você tem certeza de que os diretórios envolvidos são aqueles com o caminho exato que você está escrevendo no script;
  • os caminhos relativos são mais curtos, mas você precisa ter certeza da subárvore em que está trabalhando;
  • você pode alcançar a brevidade substituindo caminhos recorrentes por uma variável no início do script (por exemplo, /var/log/app/component/module/logfile.log - > $ module_log_dir / logfile.log)

Como Thrig notou, você poderia adicionar uma verificação para os diretórios envolvidos logo antes do comando executar.

    
por 02.11.2016 / 23:30
0

Não é necessariamente ruim chamar cd em um script, mas isso deve ser feito com parcimônia. Múltiplas chamadas para cd são um "cheiro de código". Caminhos absolutos são geralmente preferíveis.

cd pode falhar. Certifique-se de lidar com erros corretamente.

Após uma chamada para cd , os caminhos relativos se tornam inválidos. Em particular, se você estiver escrevendo um script de wrapper que prepara algumas coisas e, em seguida, executar outro comando, nunca chame cd : o usuário pode confiar no comando que está sendo executado no diretório original. Se o seu script usa nomes de arquivos passados na linha de comando, eles normalmente são relativos ao diretório original; você pode prefixar "$PWD/" para torná-los absolutos, mas isso leva a mensagens de erro ruins se algo der errado.

A variável PWD sempre contém o diretório atual, portanto, você pode salvá-lo em outra variável e voltar a chamar chamando cd depois. No entanto, lembre-se de que isso pode falhar em alguns casos de borda, como um script em execução com privilégios baixos que não pode ser alterado novamente em seu diretório original ou em um diretório movido enquanto o script está em execução.

Cuidado com os caminhos relativos: eles podem começar com - , e os argumentos de comando que começam com - são interpretados como opções se você não tomar precauções. Caminhos absolutos não têm esse problema.

    
por 03.11.2016 / 01:00