Eu encontrei BASEDIR=$(pwd)
em um script.
Existem vantagens ou desvantagens sobre o uso BASEDIR="$PWD"
, além de talvez, que $PWD
possam ser substituídas?
shell-script
pwd
Minix
fonte
fonte
$(pwd)
, porque$PWD
pode ficar desatualizado em determinadas circunstâncias.pwd
fornecerá potencialmente menos informações obsoletas do que$PWD
em alguns casos de canto.$(pwd)
por outro lado, não funcionará se o diretório atual terminar com caracteres de nova linha, significa bifurcar um processo (exceto no ksh93) e usar recursos extras. Minha opinião é o uso$PWD
de$(pwd -P)
, não vale a pena usar$(pwd)
.cd -P -- "$dir"
. se houver alguma dúvida sobre o valor de$PWD
você sempre podecd -P .
primeiro. isso também pode ser benéfico, pois você também recebe o que$PWD
havia antes$OLDPWD
e pode compará-los depois - e a próximacd ...; cd -
sequência certamente o levará de volta para onde você está agora.Respostas:
Se o bash encontrar,
$(pwd)
ele executará o comando pwd e será substituído$(pwd)
pela saída desse comando.$PWD
é uma variável quase sempre definida. O pwd é um comando shell embutido há muito tempo.Portanto
$PWD
, falhará se essa variável não estiver definida e$(pwd)
falhará se você estiver usando um shell que não suporta a$()
construção que, na minha experiência, geralmente é o caso. Então eu usaria$PWD
.Como todo nerd eu tenho meu próprio tutorial de script de shell
fonte
`command`
sintaxe era indesejável e$(command)
deve ser preferida. Tanto quanto sei, o último é compatível com POSIX, mas não tenho 100% de certeza.$()
fato, é especificado pelo POSIX, portanto, fora do pré POSIX/bin/sh
disponível no Solaris 10 ecsh
shells mais antigos e derivados, duvido que muitos outros shells mainstream não possuam esse recurso.$()
Também deve ser mencionado que
$PWD
é desejável por causa de seu desempenho. Como variável shell, pode ser resolvida quase instantaneamente.$(pwd)
é um pouco mais confuso. Se você inspecionarman 1 bulitin
um sistema com o Bash, verá quepwd
é um comando interno , o que pode levar você a acreditar que será tão rápido quanto acessar uma variável. No entanto, a$()
construção sempre lança um novo subshell (um novo processo) para executar seu conteúdo, independentemente do que está dentro. O mesmo vale para os backticks. De fato, quando eu comparo:Recebo 1,52 segundos para a
$(pwd)
chamada e 0,018 segundos para$PWD
. O lançamento desnecessário de subcascas, bem como qualquer outro processo estranho, deve ser evitado sempre que possível. Eles são muito mais caros do que as chamadas de função às quais você pode estar acostumado em outros idiomas.fonte
echo $PWD; pushd ..; echo $PWD; popd
(com adicional>/dev/null
após cada instrução) e leva 0,05 segundos. Em seguida, removi as instruções de eco (apenas pushd / popd) e demorou 0,03. Portanto, o tempoecho $PWD
ainda era de 0,01 segundos. Fiz algo semelhante$(pwd)
e demorou 2,2 segundos para cada loop, portanto, 1,1 segundos por$(pwd)
chamada.$PWD
fosse feito em segundo plano antes da avaliação das declarações de eco. Mas, claramente, o acesso$PWD
ainda é significativamente mais rápido; portanto, se a compatibilidade não for uma preocupação, esse é definitivamente um motivo para escolher um sobre o outro. Obrigado pelo trabalho em testar isso tão completamente. :)