LINUX.ORG.RU

подстановка, экранирование

 


0

1

Пишу свою обёртку для mplayer. Она находит мне сабы по критериям и подсовывает в mplayer, проблема в том, что во время подстановки в команду получается белиберда.

# В $subtitles имена файлов с субтитрами, по одному в строке
if [[ -n $subtitles ]]; then
# Обёртываем каждую строку в ключ -sub и дописываем путь к файлу
	subtitles=`echo -e "$subtitles" | sed -r 's|.*|-sub '"$subpath"'&|g' `
fi
$command "$subtitles" "$videofile"
Проблема в том, что когда при вызове $command i. e. mplayer с некими дефолтными ключами, $subtitles находится в кавычках, то он воспринимает всю строку в кавычках, как один параметр и пишет что нет такого файла: "-sub /тра/та/та". Если экранировать пробелы во время подстановки $subpath через `printf %q` или `sed -r 's/ /\\\\\\\ /g'` и убрать кавычки, то mplayer отрежет обратный слеш в пользу файла с субтитрами, а всё что после пробела — в некий файл для проигрывания.

Deleted

Убрать кавычки, поставить IFS='\n', -sub в отдельной строке.

Но проще (раз это bash) обработать массив субтитров, создав опции.

anonymous ()
Ответ на: комментарий от anonymous

IFS='\n' не помогает, -sub в отдельной строке можно конечно, но накладно выйдет. Плюс, субтитров может вообще не быть, а может быть двое или трое. В первом случае пустой -sub вызовет ошибку, а во втором снова ехала подстановка через подстановку.

Но проще (раз это bash) обработать массив субтитров, создав опции.

Не совсем понял, что именно имелось ввиду.

Deleted ()
Ответ на: комментарий от anonymous

Не-а, всё равно

Subtitles are…
-sub /home/video/anime/Azumanga Daioh/Azumanga_Daioh_12_[KAA].Russian.ass
-sub /home/video/anime/Azumanga Daioh/Azumanga_Daioh_13_[KAA].Russian.ass
++ IFS='
'
++ mplayer -fs -vf ass,screenshot -sub /home/video/anime/Azumanga 'Daioh/Azumanga_Daioh_12_[KAA].Russian.ass' -sub /home/video/anime/Azumanga 'Daioh/Azumanga_Daioh_13_[KAA].Russian.ass' '/home/video/anime/Azumanga Daioh/Azumanga Daioh - 12.avi'

Deleted ()
Ответ на: комментарий от Deleted

Давай сюда весь скрипт, в нём ересь.

anonymous ()

1.

-if [[ -n $subtitles ]]; then
+if [[ -n "$subtitles" ]]; then

2.

sed -r 's|.*|-sub '«$subpath»'&|g'

man bash

${parameter/pattern/string} Pattern substitution. The pattern is expanded to produce a pattern just as in pathname expansion. Parameter is expanded and the longest match of pattern against its value is replaced with string. ...

schizoid ★★★ ()
Ответ на: комментарий от schizoid

Первое уже исправил, второе не помогает.

Deleted ()
Ответ на: комментарий от Deleted

несколько некрасиво, но в некотором смысле проще сформировать строку запуска в новом временном скрипте и запустить его

Elyas ★★★★★ ()

можно попробовать вот так:

$ cat run.sh 
#!/bin/bash

command=./echo.sh
subtitles=`ls *.ass`
videofile="qwe.avi"
subpath="qwe/"
IFS="
"
if [[ -n "$subtitles" ]]; then
  subtitles=`echo -e "$subtitles" | sed 's|.*|-sub\n'"$subpath"'&|' `
fi
$command $subtitles "$videofile"
$ ./run.sh 
0: ./echo.sh
1: -sub
2: qwe/Azumanga_Daioh_12_[KAA].Russian.ass
3: -sub
4: qwe/Azumanga_Daioh 13 [KAA].Russian.ass
5: qwe.avi
$ ls -1
Azumanga_Daioh_12_[KAA].Russian.ass
Azumanga_Daioh 13 [KAA].Russian.ass
echo.sh
run.sh
$ cat echo.sh 
#!/bin/bash

echo "0: $0"
c=1
while [[ -n "$1" ]]; do
  echo "$c: $1"
  c=$((c+1))
  shift
done

anonymous ()
Ответ на: комментарий от anonymous

Я не вижу тут самого главного, а именно того, что мплеер прожевал субтитры и видеофайл.

Deleted ()
Ответ на: комментарий от Elyas

Кстати да! С eval можно сделать вот так:

if [ -n "$subtitles" ]; then
	subtitles=`echo -e "$subtitles" | sed -r 's|.*|-sub '"${findpath/ /\\\\\\\ }"'&|g' `
fi
eval	$command $subtitles "\"$BASEPATH$chosen_one${seasonpath:-}${videofile:-}\""
#                             ^                                                  ^
Только путь к файлу придётся взять в дополнительные кавычки.

А вообще я идиот, потому что mplayer не понимает несколько опций -sub, и я сам не знаю, почему считал, что он может. Там всё гораздо проще

-sub <subtitlefile1,subtitlefile2,...>
      Use/display these subtitle files.  Only one file can be displayed at the same time.

Deleted ()
Ответ на: комментарий от Deleted

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

anonymous ()
Ответ на: комментарий от Deleted

echo -e «$subtitles» | sed -r 's|.*|-sub '«${findpath/ /\\\\\\\ }»'&|g' `

а зачем тут вообще sed?

subtitles="-sub '"${findpath/ /\\\\\\\ }"'"$subtitles"
drBatty ★★ ()
Ответ на: комментарий от drBatty

Затем, что надо добавить ключ и дописать путь в каждой строке.

Deleted ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.