Почему файл сценария Bash, запущенный с помощью ярлыка, не может получить содержимое файла?

У меня есть сценарий, который запускает новое действие для hamster (трекер активности). Это мой текущий скрипт:

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

Проблема в том, что я хотел бы, чтобы скрипт запомнил последнее задание, поэтому я могу просто запустить его с помощью ENTER вместо повторного ввода имени. Я хочу, чтобы он сохранил имя этого файла. В настоящее время я сделал файл вручную: /usr/local/bin/hamster-log,

Мой сценарий таков:

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

Странно то, что когда я запускаю скрипт из терминала, он правильно читает содержимое файла, но когда я запускаю его с помощью ярлыка, он не читает файл.

Я установил права доступа к файлу 777,

1 ответ

Решение

Я не уверен, как вы вызываете скрипт в пользовательском ярлыке, но есть две возможности:

  • Вы звоните переводчику (например, sh /path/to/script): тогда вы звоните sh или несовместимая оболочка: подстановки команд, такие как $(<file) заменяются содержанием file только в Bash или совместимых оболочках, поэтому вы можете вызывать несовместимую оболочку;
  • Вы вызываете сценарий (например, /path/to/script): тогда сценарий не имеет шебанга наверху.

Так что либо:

  • Если первый, позвоните нужному переводчику (bash /path/to/script);
  • Если второе, добавьте шебанг вверху скрипта (#!/bin/bash).

В качестве альтернативы сделайте что-нибудь некрасивое (но POSIX и переносимое), например:

last=$(cat "$file")
Другие вопросы по тегам