Por que o mkdir falha (nenhum arquivo ou diretório) em um script com BIN_DIR = “~ / bin /”?

10

Por que o comando mkdir falha com: "Nenhum arquivo ou diretório"?

#!/bin/bash

set -e

BIN_DIR="~/bin/"

if [ ! -d "$BIN_DIR" ]; then
  mkdir "$BIN_DIR"
fi
    
por Hendré 17.11.2017 / 11:26

2 respostas

9

A mensagem de erro é produzida porque o til ~ é citado, conforme descrito na resposta do Zanna. Se você quiser usar o ~ , a parte relevante do script deve ser:

BIN_DIR=~/bin/

Se por qualquer motivo você quiser citar a string, você pode usar a variável de ambiente $HOME :

BIN_DIR="$HOME/bin/"

Na minha opinião, a segunda abordagem é a melhor prática.

    
por pa4080 17.11.2017 / 11:33
22

Não funciona porque ~ é citado. Aspas duplas " suppress expansão de til . Não há diretório com o nome literal ~/bin . Como explicado em man bash (grifo meu):

  

Expansão de til

     

Se uma palavra começar com um caractere de til sem aspas ('~'), todas as          caracteres que precedem a primeira barra não destacada (ou todos os caracteres, se          não há nenhuma barra sem destaque) são considerados um prefixo de til. Se nenhum dos          os caracteres no prefixo-til são citados, os caracteres no          O prefixo til seguido do til é tratado como um possível nome de login.          Se este nome de login for a string nula, o til é substituído pelo          valor do parâmetro do shell HOME. Se HOME não estiver definida, o diretório inicial do usuário que está executando o shell será substituído. Caso contrário, o prefixo-til é substituído pelo diretório inicial associado          com o nome de login especificado.

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 neste caso. O shell não executará nenhuma outra expansão no resultado da expansão do til, pelo menos no Bash 4 , que todos os lançamentos atuais ou remotamente recentes do Ubuntu têm . Portanto, mesmo que o seu diretório inicial contenha caracteres incomuns, como espaços, tudo bem.

Ou você pode usar $HOME de ~ , porque não é suprimida por aspas duplas, apenas por aspas simples . As aspas duplas do garantem que o valor expandido não esteja sujeito a quaisquer outras expansões, portanto divisão de palavras ou expansão de nome de arquivo não ocorre. Portanto, $HOME funciona mesmo com diretórios pessoais com nomes estranhos, desde que você mantenha as aspas duplas.

    
por Zanna 17.11.2017 / 11:40