Eu só quero entender a seguinte linha de código no shell. É usado para obter o diretório de trabalho atual. Estou ciente de que $(variable)
name retorna o valor dentro do nome da variável, mas o que $(command)
deveria retornar? Ele retorna o valor após a execução do comando? Nesse caso, podemos usar `
para executar o comando.
CWD="$(cd "$(dirname $0)"; pwd)"
A mesma saída pode ser obtida na linha de código a seguir também em versões diferentes do shell
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
Não consigo entender o significado de $(cd..
e $(dirname
.
Alguém poderia me ajudar a descobrir como esse comando é executado?
$()
vs``
.: stackoverflow.com/questions/9449778/…Respostas:
O uso de
$
semelhantes${HOME}
fornece o valor de HOME. O uso de$
semelhantes$(echo foo)
significa executar o que quer que esteja entre parênteses em uma subcamada e retornar isso como o valor. No meu exemplo, você obteria, umafoo
vezecho
que escreveráfoo
para o padrãofonte
$(...)
é a melhor maneira de escrever um comando do que tentar usar aspas. Considere escrever:gcclib=$(dirname $(dirname $(which gcc)))/lib
usando aspas. Mesmo antes de entrar nas dificuldades de fazer isso no Markdown, é mais difícil porque você tem que escapar das crases dos comandos aninhados, ao passo que você não faz com a$(...)
notação.$(echo foo)
cria uma substituição de comando, não um subshell. A outra resposta atual acerta. Acho que a substituição de comando é executada em um subshell, mais ou menos, mas eles ainda são conceitos diferentes.$(echo foo)
tentará executar o que é retornado dos parênteses, ele executará primeiro eecho foo
depois tentará executar ofoo
que dá um erroVejamos as diferentes partes do comando.
BASH_SOURCE
é uma variável de matriz bash contendo nomes de arquivos de origem. Portanto"${BASH_SOURCE[0]}"
, retornaria o nome do arquivo de script.dirname
é um utilitário fornecido pelo GNU coreutils que remove o último componente do nome do arquivo. Portanto, se você executar seu script dizendobash foo
,"$( dirname "${BASH_SOURCE[0]}" )"
retornará.
. Se você dissebash ../foo
, ele retornaria..
; porbash /some/path/foo
que ia voltar/some/path
.Finalmente, todo o comando
"$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
obtém o diretório absoluto que contém o script que está sendo invocado.$(...)
permite a substituição do comando, ou seja, permite que a saída de um comando substitua o próprio comando e pode ser aninhado.fonte
dirname
retorna o caminho do arquivo executado (relativo ou absoluto ao diretório de trabalho atual),cd
altera o pwd para esse diretório epwd
imprime o caminho absoluto do diretório de trabalho atual. Mas por que eles estão unidos&&
? E o que aconteceráDIR
secd
falhar?&&
impede que opwd
seja executado secd
falhar, de forma queDIR
ficará vazio ao invés de ter um diretório incorreto.