bash script operador de cifrão $ question - é incompatível com ~ operando?

0

Eu sou novo no ambiente Linux. Após uma pesquisa rápida, não consegui encontrar uma pergunta útil sobre o operador $ usado no script bash. Eu não sei se esta pergunta se relaciona mais com o Ubuntu (ou outro) sabor do Linux, ou minha experiência de programação tão pequena com ele.

Basicamente, eu achei que o operando ~ no Linux era perfeitamente equivalente à string '/ home / username'. Se eu tentar executar um programa após um certo atraso usando um script bash e um programa externo baseado em C, estou tão preso: não posso usar o ~ operand e manter o programa indiferente ao usuário (embora o resto o caminho do arquivo deve ser respeitado).

Por favor, forneça comentários para o seguinte (encontrar as fontes getIdle é deixado para o leitor):

#!/bin/bash
# call.sh

idle=false
idleAfter=30000     # consider idle after 30000 ms

# EXPLAIN THIS - Begin
# Strings that work
# str_getIdle_exe='/home/seb/Documents/Seb/Prjcts/Idle/getidle/src/getIdle'
# str_getIdle_exe="/home/seb/Documents/Seb/Prjcts/Idle/getidle/src/getIdle"

# Strings that don'work
str_getIdle_exe='~/Documents/Seb/Prjcts/Idle/getidle/src/getIdle'
# str_getIdle_exe="~/Documents/Seb/Prjcts/Idle/getidle/src/getIdle"
# EXPLAIN THIS - End


while true; do
  idleTimeMillis= $str_getIdle_exe
  echo $idleTimeMillis  # just for debug purposes.
  if [[ $idleTimeMillis -gt $idleAfter && $idle = false  ]] ; then
    echo "start idle"   # or whatever command(s) you want to run...
    idle=true
    /usr/bin/xflock4
  else  # just for debug purposes.
    echo "not there yet..."
  fi

  if [[ $idleTimeMillis -lt $idleAfter && $idle = true ]] ; then
    echo "end idle"     # same here.
    idle=false
  fi
  sleep 1      # polling interval

done

O que estou tentando explicar é: por que as duas strings acima executam muito bem em um shell, mas não quando são chamadas de um script?

Estou usando o Linux Mint 17.1 "Rebecca" Xfce (64 bits).

Muito, muito obrigado.

    
por Tfb9 25.01.2015 / 23:53

2 respostas

1

O til não é expandido quando está entre aspas - ref: link

Você quer remover as aspas:

str_getIdle_exe=~/Documents/Seb/Prjcts/Idle/getidle/src/getIdle

Se o caminho sob o seu homedir contiver um espaço, apenas deixe o til sem aspas:

some_path=~/"dir with spaces/file with spaces"
    
por glenn jackman 26.01.2015 / 00:12
0

O til não é expandido entre aspas (simples ou duplo).

Você tem três opções:

  1. remova as aspas:

    string="~/hello" - > string=~/hello (vulnerável ao espaço em branco)

  2. usar substituição de comando:

    string="~/hello" - > string="$(echo ~/hello)" (menos vulnerável)

  3. como sugerido por @steeldriver, use a variável de ambiente HOME :

    string="~/hello" - > string="$HOME/hello"

por Reut Sharabani 26.01.2015 / 00:23