Nowe posty

Autor Wątek: Błąd polecenia basha w bashu  (Przeczytany 2526 razy)

ra-v

  • Gość
Błąd polecenia basha w bashu
« dnia: 2009-06-26, 08:29:41 »
Mam taki kod do konwersji dźwięku (oparty o Zenity - ot ciekawostka)

(...)
case $file_type in
  ogg)
    file_out="$artist - $title.ogg"
    command="oggenc -q7 -o \\"$file_out\\" -a \\"$artist\\" -t \\"$title\\" \\"$file_in\\""
  ;;
  mp3)
    file_out="$artist - $title.mp3"
    command="lame -h -V2 -ms \\"$file_in\\" \\"$file_out\\" --ta \\"$artist\\" --tt \\"$title\\""
  ;;
esac

echo $command
$command | zenity (.....)
(...)
Wyświetla komunikat:
oggenc -q7 -o "_date_09-06-26 - _time_01-54-02.ogg" -a "_date_09-06-26" -t "_time_01-54-02" "Lenka - .mp3.wav"
ERROR: Multiple files specified when using stdin
... ale samo polecenie po przeklejeniu do powłoki działa porawnie.

Jeśli zrobię
echo $command > .tmp &&  sh .tmp | zenity (.....)
to działa poprawnie

Czy jest jakiś kod który robiłby to co powyżej, ale bez zapisywania polecenia do pliku i wykonywania go, tylko żeby wykonywał polecenie bezpośrednio z powłoki?

norbert_ramzes

  • Gość
Błąd polecenia basha w bashu
« Odpowiedź #1 dnia: 2009-06-26, 14:43:04 »
Sprawdź na innym distro/bash'u.

Gdzieś widziałem że ten błąd (Multiple...) pojawia się przy braku podanych plików (buglist).

arctgx

  • Gość
Błąd polecenia basha w bashu
« Odpowiedź #2 dnia: 2009-06-26, 19:00:58 »
Chodzi prawdopodobnie o to, że nazwy parametrów zawierają otoczone spacjami myślniki, a jak wiadomo, myślnik może być potraktowany przez lame jako standardowe wejście. Stąd, być może, taki komunikat.

Mały eksperyment:
  tmp $ touch -l
touch: invalid option -- 'l'
Spróbuj `touch --help' dla uzyskania informacji.
  tmp $ touch -- -l
  tmp $ ls -l
-rw-r--r-- 1 arctgx arctgx       0 06-26 18:55 -l
drwx------ 2 root   root     16384 2008-12-01  lost+found
... itd.
  tmp $ ls "-l"
... pokazuje to samo
  tmp $ ls -- "-l"
-l
  tmp $ ls -l -- "-l"
-rw-r--r-- 1 arctgx arctgx 0 06-26 18:55 -l
  tmp $ ls -l -- -l
-rw-r--r-- 1 arctgx arctgx 0 06-26 18:55 -l
Zgodnie z nim, można by przenieść niektóre kawałki polecenia konwertującego poza podwójną kreskę oznaczającą koniec opcji polecenia. O ile nie jest to problemem dla pliku wejściowego i wyjściowego, o tyle nadanie albumu czy tytułu pozostaje nadal problemem.
"lame -h -V2 -ms --ta \\"$artist\\" --tt \\"$title\\" -- \\"$file_in\\" \\"$file_out\\""
Nie potrafię jeszcze solidnie wytłumaczyć, dlaczego bezpośrednio w warunku case działa mi to:
eval "lame -h -V2 -ms --ta \\"$artist\\" --tt \\"$title\\" -- \\"$file_in\\" \\"$file_out\\""
czyli wersja z eval.

Polecam slajd http://www.uniforum.chi.il.us/slides/bash1.pdf

ed. Łee tam, namieszałem znowu, bo co ma wspólnego traktowanie kreski jako parametru pozycyjnego z traktowaniem jako standardowego wyjścia? ;)