Por que o arquivo de script Bash executado pelo atalho não consegue obter o conteúdo de um arquivo?

1

Eu tenho um script que inicia uma nova atividade para hamster (rastreador de atividades). Este é o meu script atual:

ACTIVITY='zenity --entry --title "Enter new activity name" --text "New activity name:"'
hamster start $ACTIVITY

O problema é que eu gostaria que o script lembrasse a última tarefa para que eu pudesse apenas executá-lo com ENTER em vez de digitar o nome novamente. Eu quero que ele armazene o nome dele no arquivo. Atualmente eu fiz o arquivo manualmente: /usr/local/bin/hamster-log .

Meu script até agora é o seguinte:

file=/usr/local/bin/hamster-log
last=$(<$file)
activity=$(zenity --entry --title "Enter new activity name" --text "New activity name:" --entry-text "$last")
hamster start "$activity"
if [ ! -z "$activity" ]; then
    destdir=/some/directory/path/filename
    if [ -f "$file" ]; then
        echo "$activity" > "$file"
    fi
fi

O mais estranho é quando eu executo o script pelo terminal, ele lê o conteúdo do arquivo corretamente, mas quando eu o executo usando um atalho ele não lê o arquivo.

Eu configurei as permissões do arquivo para 777 .

    
por Juraj.Lorinc 14.01.2016 / 23:12

1 resposta

1

Não sei como você está chamando o script no atalho personalizado, mas há duas possibilidades:

  • Você está chamando um intérprete (por exemplo, sh /path/to/script ): você está chamando sh ou um shell incompatível: substituições de comandos como $(<file) são substituídas pelo conteúdo de file apenas no Bash ou compatível shells, então você pode estar chamando uma shell incompatível;
  • Você está chamando o script (por exemplo, /path/to/script ): o script não tem um shebang no topo.

Então:

  • Se o primeiro, chame o intérprete correto ( bash /path/to/script );
  • Se o segundo, adicione um shebang na parte superior do script ( #!/bin/bash ).

Como alternativa, faça algo feio (mas POSIX e portátil) como:

last=$(cat "$file")
    
por kos 14.01.2016 / 23:43