Expandindo os caminhos de conveniência do til ao usar caminhos citados em um script bash?

1

Eu sempre usei caminhos que não são codificados dentro de citações para meus scripts bash. Dessa forma, se o caminho (usuário digitado, diretório pessoal do usuário, etc) tiver caracteres, espaços ou traços estranhos, meu script não será incomodado e continuará como de costume.

Mas notei que, embora funcione com a maioria dos caminhos, ele falhará com os caminhos que têm um til como um atalho para o diretório inicial do usuário. por exemplo:

# works
install dotfile "/home/user/.dotfile"

# fails
install dotfile "~/.dotfile"
# fails
cp dotfile "~/.dotfile"

As citações estão tentando proteger contra a análise do ~ em si. como está tentando copiar o arquivo para ./~/.dotfile

Eu quero usar ~/ porque é conveniente (e simples. e simples significa menos bugs) e coloque-o entre aspas porque é seguro contra espaços e traços. Qualquer maneira de ter os dois?

    
por gcb 03.02.2015 / 02:56

2 respostas

2

I want to use ~/ because it is convenient (and simple. and simple means less bugs), and enclose it in quotes because it is safe against spaces and dashes. Any way to have both?

Sim, é uma boa prática usar aspas duplas. Apenas não os coloque em torno do ~/ . Deixe essa parte sem aspas:

install dotfile ~/".dotfile"

Expansões de til e nomes de diretórios domésticos difíceis

A expansão ~ usa a variável HOME . Vamos criar um diretório com nome difícil e atribuí-lo a HOME e ver como o shell se comporta:

$ mkdir $'/tmp/spaces and\ttabs'
$ HOME=$'/tmp/spaces and\ttabs'
$ cd ~/
$ pwd
/tmp/spaces and tabs

Assim, funcionou corretamente.

    
por 03.02.2015 / 04:20
2

Tente usar eval para expandir o ~/ para um caminho completo real para o arquivo :

my_path=".dotfile"
eval full_path=$(printf "~/%q" "$my_path")
echo $full_path

Ou tente isto:

eval full_path=$(echo "~/.dotfile")
echo $full_path
    
por 03.02.2015 / 03:13

Tags