Usando a fonte
O comando source
não executa outro script. Simplesmente puxa o conteúdo deste outro script para este script e, em seguida, executa seu conteúdo como se fosse originalmente parte do script de chamada.
É basicamente um mecanismo para incluir o conteúdo de outro script no mesmo escopo que o seu.
Usando o readlink
Este comando está lá, caso o script original tenha sido chamado por meio de um link.
Usando sed
Este script está usando o sed para transformar o nome do script de chamada no nome config
.
Exemplo
Digamos que tenhamos esse script chamado orig.bash
:
#!/bin/bash
printf "exectued as: %s\n" $0
cmd=$(readlink -e $0 | sed "s:[^/]*$:config:")
printf "sourcing as: %s\n" "$cmd"
Este programa fará duas coisas.
-
imprima o valor de
$0
printf "exectued as: %s\n" $0
-
imprima o valor do comando
readlink ...
cmd=$(readlink -e $0 | sed "s:[^/]*$:config:") printf "sourcing as: %s\n" "$cmd"
Agora vamos criar um link para esse script, link2orig.bash
. Portanto, temos os seguintes arquivos agora em nosso diretório:
# creates link
$ ln -s orig.bash link2orig.bash
# results after
$ ls -l
total 4
lrwxrwxrwx 1 saml saml 9 Sep 5 06:23 link2orig.bash -> orig.bash
-rwxrwxr-x 1 saml saml 126 Sep 5 06:31 orig.bash
Agora observe o que acontece
Então, agora, quando executamos nosso script de exemplo usando o nome real ou o link, ainda podemos substituir a coluna config
pelo argumento do chamador. Qual é outro arquivo que contém informações de configuração para nosso script, que estamos pesquisando.
$ ./orig.bash
executed as: ./orig.bash
sourcing as: /home/saml/tst/89518/config
$ ./link2orig.bash
executed as: ./link2orig.bash
sourcing as: /home/saml/tst/89518/config
Se você perceber, uma das vantagens dessa abordagem é que ela é extremamente tolerante em ser chamada de diferentes maneiras e de diferentes locais no sistema.
$ ../89518/orig.bash
executed as: ../89518/orig.bash
sourcing as: /home/saml/tst/89518/config
$ ../89518/link2orig.bash
executed as: ../89518/link2orig.bash
sourcing as: /home/saml/tst/89518/config