В моем скрипте zsh я получаю строку, представляющую эпоху Unix, например:
myTimestamp = "1719742786"
Я хочу преобразовать эту дату в форматированную строку, а затем сохранить ее в переменной, чтобы ее можно было использовать в следующем скрипте ffmpeg. Я делаю это следующим образом:
theDate=$(date -u -r "$myTimestamp" "+%b %d, %H:%M:%S")
echo "$theDate"
который печатает на моем экране то, что я хочу:
Jun 30, 06:19:48
но когда я пытаюсь использовать эту переменную в своем скрипте ffmpeg, я получаю ошибки:
ffmpeg -y -i "$file" -vf \
"drawtext=text='$theDate':fontcolor=gray:fontsize=$fontSize:x=$width:y=$height:" \
"$output"
Обратите внимание: если я заменю '$theDate' в скрипте (на что-то вроде '$myTimestamp'), ошибок не будет.
Вместе с Error initializing filters я получаю следующую (возможно, важную?) ошибку:
Предоставляется как текст, так и текстовый файл. Пожалуйста, укажите только один
Обратите внимание, что я использую MacOS v14.5. man date упоминает The date utility is expected to be compatible with IEEE Std 1003.2 (“POSIX.2”). With the exception of the -u option, all options are extensions to the standard.
Мой полный сценарий:
#!/bin/zsh
outDir = "printed"
width=200
height=650
fontSize=95
for file in initial/*.png; do
filename=$(basename "$file")
prefix = "${filename%.*}"
theDate=$(date -u -r "$prefix" "+%b %d, %H:%M:%S")
output = "$outDir/$filename"
echo "$theDate"
ffmpeg -y -i "$file" -vf \
"drawtext=text='$theDate':fontcolor=gray:fontsize=$fontSize:x=$width:y=$height:" \
"$output"
done
exit
Ваш сценарий не может быть одновременно сценарием Bash и сценарием Zsh, равно как и ваш вопрос не может быть одновременно написан на английском и голландском языках. Который из них? Конечно, если это на самом деле скрипт sh, он также действителен в Bash и (при некоторых обстоятельствах) в Zsh. См. также Разница между sh и bash
Вы должны опубликовать здесь код, который вы используете, как упомянул @Cyrus, date -r ожидает файл. При выполнении theDate=$(date -u -r "$myTimestamp" "+%b %d, %H:%M:%S") я получаю date: 1719742786: No such file or directory
Да, спасибо @tripleee. Это Zsh скрипт.
И все же, @MarcelPreda, когда я убираю опцию -r в дате, я получаю illegal time format. Я включил полный сценарий. Папка initial содержит набор изображений с такими названиями, как 1719742786.png.
Если вы используете MacOS, у вас вообще нет GNU date (по крайней мере, не из коробки). Не могли бы вы отредактировать, чтобы указать свою платформу и, возможно, результат date --help, если вы не знакомы с различиями платформ?
@tripleee - да, я использую MacOS, и добавил этот факт в пост. И похоже, что -u нестандартно для MacOS.
Если предположить, что команда date ... работает, то проблема может заключаться в том, что в строке $theDate есть : (двоеточия), которые используются в качестве разделителей полей для ввода фильтров ffmpeg. Либо вы избегаете двоеточий, либо используете другой символ, либо записываете $theDate в файле типа the_date.txt и после этого используете ffmpeg -y -i "$file" -vf "drawtext=textfile=the_date.txt:... . Я выберу последний вариант: пишите в файл и пользуйтесь drawtext=textfile=...
@MarcelPreda - Ты прав! Я избежал двоеточий, и это работает! Я не хотел писать в файл, потому что с помощью скрипта я создаю тысячи изображений. (Вы хотите это написать?)
Проблема не столько в том, что -u нестандартен, сколько в том, что комментаторы GNU/Linux предполагают, что у вас есть другие нестандартные опции, которые «де-факто» являются стандартными на их платформе.
Кстати, вам не нужен дочерний процесс для basename. Можно просто написать filename=$file:t.
Дубликат stackoverflow.com/questions/55334636/…
@coco, вы сказали I didn't want to write to a file, because there are thousands of images that I'm creating with the script. Если вы не выполняете команды ffmpeg параллельно, вы можете использовать тот же файл, просто обновите содержимое.

Как упоминалось в комментарии:
Проблема в том, что в строке $theDate есть : (двоеточия), которые используются как разделители полей для ввода фильтров ffmpeg.
Либо вы избегаете двоеточий, либо используете другой символ, либо записываете $theDate в файл типа the_date.txt и после этого используете
ffmpeg -y -i "$file" -vf "drawtext=textfile=the_date.txt:... "
Я выберу последний вариант: записать в файл и использовать drawtext=textfile=... Если вы не выполняете команды ffmpeg параллельно, вы можете повторно использовать один и тот же файл. Если вы выполняете команды ffmpeg параллельно, вам необходимо создавать уникальные имена файлов и удалять их после завершения команды ffmpeg, чтобы не оставлять там тысячи файлов.
Использование внешнего файла кажется гораздо более опасным, чем просто экранирование глупых двоеточий. date +"%b %d, %H\:%M\:%S"
Опция даты GNU
-rожидает имя файла, а не метку времени. Смотритеman date.