scrot, date в имени файла

Автор pa_, 24 октября 2018, 10:06:49

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

pa_

Добрый день.

Кто может подсказать, где кроется моя ошибка.

Дано:
  - debian 9.5
  - i3-wm 4.13
  - rxvt-unicode 9.22
  - bash 4.4
  - scrot 0.8

urxvt запускаю стандартным сочетанием клавиш Mod4 + Return

в bash_aliases были прописаны следующие строки

alias scs="scrot -s /srv/pic/screen/$(date +%Y-%m-%d_%H-%M-%S).png"
alias sss="scrot -d 5 -c /srv/pic/screen/$(date +%Y-%m-%d_%H-%M-%S).png"

время в имени файла "берется" на момент открытия эмулятора терминала и больше не изменяется
т.е. если я делаю 2 подряд screenshot`а то последний затирает предыдущий и время создания не совпадает с часами

если в том же терминале выполнить $date +%Y-%m-%d_%H-%M-%S , команда отрабатывает корректно

при этом, если в bash_aliases прописать алиасы в виде функций

function scs() {
  D=`date +%Y-%m-%d_%H-%M-%S`
  scrot -s /srv/pic/screen/$D.png
}
function sss() {
  D=`date +%Y-%m-%d_%H-%M-%S`
  scrot -d 5 -c /srv/pic/screen/$D.png
}

все работает корректно, время изменяется на момент создания screenshot`а

ps
свою проблему решил: вынес необходимый функционал в sh скрипты, положив их в ~/bin и прописав путь до bin в PATH, это оказалось более удобно, когда вызываешь через dmenu

Но почему в первом случае алиас работает некорректно ?

endru

В первом случае у тебя переменная, которую ты определяешь после входа. В нее сразу подставятся все данные (текущая дата время).
Когда в следующий раз сработает присвоение новых данных в этих переменных? Только после входа!

pa_

не понял, поясни на пальцах
разве не должно время вычисляться в любом случае, когда я запускаю алиас, что в первом, что во втором случае ?

endru

#3
нет не должно. ты понимаешь что такое переменные? и как они работают? и какое время они существуют?
алиас в баше - это простая переменная.
вот пример в коде, как работает это в первом случае:
#!/bin/bash
D=`date +%Y-%m-%d_%H-%M-%S` #присваиваем переменной время, тоже самое происходит при входе в систему с алиасами.
sleep 60 # ждем 60 секунд, эмуляция рабочей деятельности.
echo $D
echo $(date +%Y-%m-%d_%H-%M-%S) #выводим реальное время.

Какой будет результат переменной D?
тоже самое происходит и с алиасом (по факту переменная). При входе ты объявляешь алиас, и дальше этот алиас всегда будет одного значения.

А вот второй случай:
#!/bin/bash
function realtime() {
  D=`date +%Y-%m-%d_%H-%M-%S`
  echo $D
}
D=`date +%Y-%m-%d_%H-%M-%S` #присваиваем переменной время, тоже самое происходит при входе в систему с алиасами.
sleep 60 # ждем 60 секунд, эмуляция рабочей деятельности.
echo "Перед запуском функции D=$D"
realtime
echo "После запуска функции D=$D"

здесь realtime - это функция, как можно заметить внутри нее тоже можно использовать переменные.

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

Ogis1975

Цитата: pa_ от 24 октября 2018, 10:06:49Кто может подсказать, где кроется моя ошибка.
Доброе время суток. Можете попробовать мой скрипт.

#!/bin/sh
# Take screenshot of entire screen and display shot.
# https://github.com/Minda1975/i3-config


SCREENSHOT_DIR=$HOME/screenshots
mkdir -p $SCREENSHOT_DIR
sleep 0.2; scrot -m "$SCREENSHOT_DIR/%Y-%m-%d-%H%M%S_\$wx\$h.png" -e "xdg-open \$f"


Что он делает?
При нажатии сочетание клавиш, делается скриншот, с датой, и автоматически отправляется в папку screenshots