O que significa o seguinte:
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
Estou particularmente interessado nesta parte:
varible=$(...)
Sei que parênteses são usados para executar um subprocesso, mas e se forem usados junto $?
O que significa o seguinte:
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
Estou particularmente interessado nesta parte:
varible=$(...)
Sei que parênteses são usados para executar um subprocesso, mas e se forem usados junto $?
Respostas:
No manual do Bash ( man bash):
Substituição de Comando
A substituição de comando permite que a saída de um comando substitua o
nome do comando Existem duas formas:
$ (comando)
ou
`comando`
O Bash executa a expansão executando o comando em um subshell
ambiente e substituindo a substituição de comando pelo padrão
saída do comando, com as novas linhas finais excluídas. embutido
novas linhas não são excluídas, mas podem ser removidas durante a palavra
dividindo. A substituição do comando $ (arquivo cat) pode ser substituída pelo
equivalente, mas mais rápido, $ (<arquivo).
(Isto é válido para todos Bourne-como conchas, ou seja sh, ksh, zsh, bashetc., e zshtambém é capaz de capturar dados com caracteres NUL incorporados desta forma)
O comando
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
irá atribuir o nome do diretório onde o script está localizado (ao mesmo tempo, mudando todas as barras invertidas em barras) para a variável basedir. Quaisquer erros, avisos ou outras mensagens de diagnóstico enviadas para o fluxo de erros padrão ainda serão exibidos no terminal ( $(...)apenas captura a saída padrão do comando).
O shell começará executando a substituição do comando mais interno:
echo "$0" | sed -e 's,\\,/,g'
A saída disso será fornecida como uma string dirnamee a saída será atribuída à variável basedir.
As aspas duplas existem para garantir que nenhuma divisão de palavras ou globbing de nome de arquivo seja realizada; caso contrário, você pode achar que o script falha ou produz uma saída estranha quando $0(o nome do script, incluindo o caminho usado para executá-lo) contém um espaço caractere ou um caractere globbing do nome do arquivo (como ?ou *).
Em geral, é uma boa ideia sempre citar expansões (expansões variáveis, substituições de comandos e expansões aritméticas). Veja esta pergunta e suas respostas para uma excelente explicação sobre por que essa é uma boa ideia.
Se o script foi executado como
$ /usr/local/bin/script.sh
então basedirobterá o valor de /usr/local/bin.
Ou, no Cygwin:
$ bash c:\\Users\\Me\\script.sh
então basedirobterá o valor de c:/Users/Me. As barras invertidas duplas na linha de comando, neste caso, são apenas para escapar das barras invertidas únicas do shell. O valor real de $0é c:\Users\Me\script.sh.
Outra maneira de fazer a mesma coisa sem usar dirname, echoe sedseria
basedir="${0//\\//}"
basedir="${basedir%/*}"
/bin/shdo Solaris 10 ou anterior) não suportava $(...).
A varible=$(..)chamada substituição de comando e não significa nada além de executar um comando shell e armazenar sua saída em uma variável ou exibir de volta usando o comando echo. Por exemplo, exiba data e hora:
echo "Today is $(date)"
e para armazená-lo em uma variável:
SERVERNAME=$(hostname)
Para obter mais informações: https://www.cyberciti.biz/faq/unix-linux-bsd-appleosx-bash-assign-variable-command-output/
man bashe procurar substituição de comando