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

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

Estou no processo de conversão de alguns scripts em lote em scripts de shell. 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

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

teste1.sh:

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

teste2.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 uso de caminhos em scripts de shell?

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

Responder1

Não é necessariamente uma coisa ruim chamar cdum script, mas isso deve ser feito com moderação. Várias chamadas para cdsão um “cheiro de código”. Caminhos absolutos são geralmente preferíveis.

cdpode falhar. Certifique-se de lidar com os erros corretamente.

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

A variável PWDsempre contém o diretório atual, então você pode salvá-lo em outra variável e voltar chamando cdmais tarde. No entanto, esteja ciente de que isso pode falhar em alguns casos extremos, como um script executado com poucos privilégios que não tem permissão para voltar ao diretório original ou um diretório que é 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.

Responder2

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

  • os caminhos absolutos são mais claros: quem terá que manter/modificar seu script (você ou outros) poderá saber sempre 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 obter encurtamento 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 notado, você pode adicionar uma verificação dos diretórios envolvidos pouco antes da execução do comando.

informação relacionada