Побег двоеточий, равных, амперсандов в аргументах - PullRequest
2 голосов
/ 30 марта 2012

Ниже мой код, который ведет себя очень странно, и я не уверен, что понимаю причину, но я думаю, что это как-то связано с расширением пути:

РЕДАКТИРОВАТЬ: это сценарий asxgrab, упомянутый во втором листинге:

#!/usr/bin/env bash

let "i=0"

GET "$1" | grep 'href="mms://' | while read line
do
    echo "$line"
    address=`echo $line | grep -Eow '"[^"]+"'`
    address_length=$((${#address}-2))
    address=${address:1:address_length}
    echo "Grabbing '$address', attempt $i, $address_length"
    mplayer "'$address' -dumpstream -dumpfile '$2.wmv' -vf scale\=320\:240" > /dev/null
    if [ ! $? ]; then
        break 1
    fi
    let "i++"
done

Я перепробовал десятки разных способов побега, цитирования и еще чего-то, и я думаю, что исчерпал свое творчество ... пожалуйста, помогите!

Предположим, что скрипт вызывается со следующими аргументами:

./asxgrab 'http://switch3.castup.net/cunet/gm.asp?ai=16&ip=79.180.37.230&course=c20478/2012b&cuud=user:77f6c69526b9fa05f78d3d6679630308d324d1043027b0720c295b93e4abb183&ar=c20478_12b_784_01_1&ticket=58353E7A69BF1B9XO655E9E683016C5255C08DD37211ECF495F72A64E5278AA434CSP3C10C028D604AAD6C39FE7D71386D230983BBAF58A2511D14222F95090AE2C4C55CB696B82919A5A8EB44EAF8954DEDB5' 'java.0'

Полученный ответ выглядит так:

<asx version="3.0">
    <!-- GMX -->
    <param name="encoding" value="utf-8" />
    <title>CastUP: c20478_12b_784_01_1</title>
    <MOREINFO HREF = "" />

    <entry>
    <PARAM NAME="EntryType" VALUE="Content" />

    <param name="encoding" value="utf-8" />
    <PARAM NAME="CastUP_AssociatedURL" VALUE="" />
    <PARAM NAME="CastUP_Content_Config" VALUE="" />
    <PARAM NAME="CastUP_Content_ClipMediaID" VALUE="9067325" />
    <author>openu</author>
        <title>CastUP: c20478_12b_784_01_1</title>
<ref href="mms://s3fwm.castup.net/server12/16/798/79837168-61.wmv?ct=IL&rg=BZ&aid=16&ts=0&cu=FE81687B-33CD-4441-A8F6-1DEC9923332C&cuud=user:77f6c69526b9fa05f78d3d6679630308d324d1043027b0720c295b93e4abb183&cuud=user:77f6c69526b9fa05f78d3d6679630308d324d1043027b0720c295b93e4abb183" />
<ref href="...." />

    </entry>

Когда я делаю это:

mplayer "mms://s3fwm.castup.net/server12/16/798/79837168-61.wmv?ct=IL&rg=BZ&aid=16&ts=0&cu=C6527A33-587F-4148-A3D2-E7EDED51316B&cuud=user:77f6c69526b9fa05f78d3d6679630308d324d1043027b0720c295b93e4abb183&cuud=user:77f6c69526b9fa05f78d3d6679630308d324d1043027b0720c295b93e4abb183" -dumpstream -dumpfile java0.wmv -vf scale=320:240

из терминала, работает, но не работает из скрипта. Вместо этого он пытается обрезать $line или что-то в этом роде. Я даже не понимаю, что происходит, но вывод абсолютно без последствий ...

Это сайт моего универа, и, как ни странно, это лекция по Java :) 10 *

EDIT:

<ref href="mms://s0dwm.castup.net/server12/16/798/79837168-61.wmv?ct=IL&rg=BZ&aid=16&ts=0&cu=111A3770-29DC-40EC-85EC-93453E2819D7&cuud=user:77f6c69526b9fa05f78d3d6679630308d324d1043027b0720c295b93e4abb183&cuud=user:77f6c69526b9fa05f78d3d6679630308d324d1043027b0720c295b93e4abb183" />
Grabbing 'mms://s0dwm.castup.net/server12/16/798/79837168-61.wmv?ct=IL&rg=BZ&aid=16&ts=0&cu=111A3770-29DC-40EC-85EC-93453E2819D7&cuud=user:77f6c69526b9fa05f78d3d6679630308d324d1043027b0720c295b93e4abb183&cuud=user:77f6c69526b9fa05f78d3d6679630308d324d1043027b0720c295b93e4abb183', attempt 0, 268
Can't open joystick device /dev/input/js0: No such file or directory
Can't init input joystick
mplayer: could not connect to socket
mplayer: No such file or directory
Failed to open LIRC support. You will not be able to use your remote control.
No stream found to handle url 'mms://s0dwm.castup.net/server12/16/798/79837168-61.wmv?ct=IL&rg=BZ&aid=16&ts=0&cu=111A3770-29DC-40EC-85EC-93453E2819D7&cuud=user:77f6c69526b9fa05f78d3d6679630308d324d1043027b0720c295b93e4abb183&cuud=user:77f6c69526b9fa05f78d3d6679630308d324d1043027b0720c295b93e4abb183' -dumpstream -dumpfile 'java.0.wmv' -vf scale=320:240
d324d1043027b0720c295b93e4abb183" />
Grabbing '', attempt 1, -2
Can't open joystick device /dev/input/js0: No such file or directory
Can't init input joystick
mplayer: could not connect to socket
mplayer: No such file or directory
Failed to open LIRC support. You will not be able to use your remote control.
File not found: ''' -dumpstream -dumpfile 'java.0.wmv' -vf scale=320:240'
Failed to open '' -dumpstream -dumpfile 'java.0.wmv' -vf scale=320:240.
027b0720c295b93e4abb183" />

Это вывод, который я получаю из скрипта.

MPlayer SVN-r31918 (C) 2000-2010 MPlayer Team
Can't open joystick device /dev/input/js0: No such file or directory
Can't init input joystick
mplayer: could not connect to socket
mplayer: No such file or directory
Failed to open LIRC support. You will not be able to use your remote control.

Playing mms://s3fwm.castup.net/server12/16/798/79837168-61.wmv?ct=IL&rg=BZ&aid=16&ts=0&cu=C6527A33-587F-4148-A3D2-E7EDED51316B&cuud=user:77f6c69526b9fa05f78d3d6679630308d324d1043027b0720c295b93e4abb183&cuud=user:77f6c69526b9fa05f78d3d6679630308d324d1043027b0720c295b93e4abb183.
STREAM_ASF, URL: mms://s3fwm.castup.net/server12/16/798/79837168-61.wmv?ct=IL&rg=BZ&aid=16&ts=0&cu=C6527A33-587F-4148-A3D2-E7EDED51316B&cuud=user:77f6c69526b9fa05f78d3d6679630308d324d1043027b0720c295b93e4abb183&cuud=user:77f6c69526b9fa05f78d3d6679630308d324d1043027b0720c295b93e4abb183
Resolving s3fwm.castup.net for AF_INET6...

Couldn't resolve name for AF_INET6: s3fwm.castup.net
Resolving s3fwm.castup.net for AF_INET...
Connecting to server s3fwm.castup.net[212.179.13.65]: 1755...

Connected
file object, packet length = 6100 (6100)
unknown object
unknown object
unknown object
stream object, stream ID: 1
stream object, stream ID: 2
unknown object
data object
mmst packet_length = 6100
Cache size set to 64 KBytes
Stream not seekable!

И это ожидаемый результат.

Ответы [ 3 ]

2 голосов
/ 30 марта 2012

Вы пробовали это?

mplayer "$address" -dumpstream -dumpfile "$2.wmv" -vf "scale=320:240" > /dev/null

Секреты bash:

  • Переменные внутри двойных кавычек расширены;внутри одинарных кавычек нет.
  • Слова внутри кавычек обрабатываются как один токен.
  • Кавычки одного типа экранируют слова другого типа.

Исходная строка

mplayer "'$address' -dumpstream -dumpfile '$2.wmv' -vf scale\=320\:240" > /dev/null

называется mplayer с единственным аргументом '$address' -dumpstream -dumpfile '$2.wmv' -vf scale\=320\:240, но mplayer хочет, чтобы каждый из этих токенов был отдельным словом.

2 голосов
/ 30 марта 2012

Если я все правильно понимаю, единственная реальная проблема, которую я вижу, состоит в том, что эта строка:

    mplayer "'$address' -dumpstream -dumpfile '$2.wmv' -vf scale\=320\:240" > /dev/null

должно быть:

    mplayer "$address" -dumpstream -dumpfile "$2.wmv" -vf scale=320:240 > /dev/null

То есть вам нужно удалить двойные кавычки, которые собирают все аргументы mplayer в один аргумент, и вам нужно удалить одинарные кавычки вокруг, а внутри них некоторые обратные слеши. 1008 *

Другие вещи, которые я мог бы изменить ради чистоты:

  • изменение read line на read -r line устранит любую потенциальную странность от обратной косой черты.
  • строка line="${line%$'\r'}" в начале тела while -loop будет лежать, чтобы снять любую обеспокоенность по поводу случайных возвратов каретки.
  • изменение address=`echo $line ... на address=`echo "$line" ... устранит любой риск расщепления слов и расширения имени файла и так далее (не то, чтобы они казались очень вероятными, как есть).
  • тест [ ! $? ] не имеет смысла (поскольку $? никогда не бывает пустым, не так ли?); изменение его на && break 1 в конце предыдущей команды будет более понятным ИМХО и более эффективным.
1 голос
/ 30 марта 2012

Ваш bash-скрипт очень «обязателен», так как он был переписан из Assembly.

Другой подход:

  • получить файл дескриптора
  • очистить дескрипторfile (оставьте в нем mms: // ... strings)
  • используйте этот очищенный результат в качестве входных данных для циклической обработки

Это был один слой, я просто разбил его.Вы бы поместили код между do..done.Мне было все равно, что имена файлов были огромными, я дал их в качестве вывода .wmv:

link="http://switch3.castup.net/cunet/gm.asp?ai=16&ip=79.180.37.230&course=c20478/2012b&cuud=user:77f6c69526b9fa05f78d3d6679630308d324d1043027b0720c295b93e4abb183&ar=c20478_12b_784_01_1&ticket=58353E7A69BF1B9XO655E9E683016C5255C08DD37211ECF495F72A64E5278AA434CSP3C10C028D604AAD6C39FE7D71386D230983BBAF58A2511D14222F95090AE2C4C55CB696B82919A5A8EB44EAF8954DEDB5"

for i in $(curl -s "$link" | awk '/mms/ {gsub (/<ref href="/, ""); gsub(/" \/>/, ""); print $0}')
do
  mplayer $i -dumpstream -dumpfile $i.wmv -vf scale=320:240
done
...