Por que o comando mkdir falha com: "Esse arquivo ou diretório não existe"?
#!/bin/bash
set -e
BIN_DIR="~/bin/"
if [ ! -d "$BIN_DIR" ]; then
mkdir "$BIN_DIR"
fi
command-line
bash
scripts
home-directory
mkdir
Hendré
fonte
fonte
Respostas:
A mensagem de erro é produzida porque o til
~
é citado, conforme descrito na resposta de Zanna . Se você deseja usar o~
, a parte relevante do script deve ser:Se, por qualquer motivo, você desejar citar a sequência, poderá usar a variável de ambiente
$HOME
:Na minha opinião, a segunda abordagem é a melhor prática.
fonte
~
scripts. funciona exatamente da mesma maneira que na linha de comando. O problema é que a cotação bloqueia a expansão do til, conforme explicado na resposta de Zanna .$HOME
scripts seja uma boa ideia.$HOME
do que usar a expansão til? A única explicação que você deu é dizer: "é uma idéia melhor, porque você deve prestar menos atenção". Eu não tenho idéia o que isso significa. Você pode explicar isso em uma edição? Sem ele, não há nada que apóie sua resposta, então com certeza ela pertence a ela. A expansão de til foi solicitada pelo POSIX por um bom tempo e a linha hashbang do script é,#!/bin/bash
portanto, suponho que a portabilidade não seja o motivo.Não funciona porque
~
é citado. Aspas duplas"
suprimem a expansão do til . Não há diretório com o nome literal~/bin
. Conforme explicado emman bash
(ênfase minha):Você pode remover as aspas , pois
~
é o único caractere no caminho~/bin
que fará com que o shell execute uma expansão, e queremos a expansão nesse caso. O shell não fará mais expansões no resultado da expansão til, pelo menos no Bash 4 , que todas as versões atuais ou remotamente recentes do Ubuntu têm . Portanto, mesmo que seu diretório pessoal contenha caracteres incomuns, como espaços, tudo bem.Ou você pode usar em
$HOME
vez de~
, porque a expansão do parâmetro não é suprimida por aspas duplas, apenas por aspas simples . As aspas não garantir que o valor expandido não é por si só dependente de outras expansões, então repartição de palavras ou expansão filename não ocorrerá. Também$HOME
funciona com diretórios pessoais com nomes estranhos, desde que você mantenha aspas duplas.fonte
cd '~'
é-bash: cd: ~: No such file or directory
.~
não faz parte da expansão de parâmetros.