Почему файл сценария 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")