проблема с pipe

Модератор: Модераторы разделов

demidrol
Сообщения: 47
ОС: Gentoo Linux

проблема с pipe

Сообщение demidrol »

Написал вот скрипт для того, чтобы в id3 тэг записывать имя файла в нужной мне кодировке(локаль у меня utf-8, а xmms понимает только cp1251 или koi8-r - остановился на cp1251). Все вроде работает - скрипт нужно помещать в директорию с музыкой, в качестве аргумента можно указывать исполнителя. Только вот почему-то в указанных строках не работает pipe(приходится заводить временный файл). Интересно, в чем здесь проблема?

Код: Выделить всё

#!/bin/bash

#всякие украшалки...
function progress_bar
{
    if [ -z "$1" ]
    then
        exit -1
    fi
    if [ "$1" -gt "100" ]
    then
        echo "overflow"
        exit -2
    fi

    SOME="="
    EMPTY=" "
    COLUMNS=80
    BAR_LENGTH=$(($(($COLUMNS))-6))
    DOT=$(($BAR_LENGTH))
    PERCENT=$(($1*$DOT/100))

    echo -en "\r|"

    for ((i=0;$i<$PERCENT;i=$i+1))
    do
    echo -n "$SOME"
    done

    for ((i=$PERCENT;i<$BAR_LENGTH;i=$i+1))
    do
    echo -n "$EMPTY"
    done

    echo  -n "|$1%"
}


echo "Convertion progress:"

let COUNTER=0

#считаем количество аудио-файлов
for NAME in ./*.mp3;
do
    if [ "$NAME" == "./*.mp3" ]
    then
        exit -1
    fi
    let COUNTER=$COUNTER+1
done

let CURRENT=0

#в этом цикле конвертируем тэги
for NAME in ./*.mp3;
do
    let CURRENT=CURRENT+1
    let __PROGRESS=(100*$CURRENT)/$COUNTER
    if [ "$NAME" == "./*.mp3" ]
    then
        echo "no files in this directory"
        exit -1
    fi

    TAG="$NAME"
    echo "$TAG" | awk -F'[-]' '{print $2}' | iconv -f utf-8 -t cp1251 > tmp
    read TAG < tmp
#      можно было, конечно, и так
#      echo "$TAG" | awk -F'[-]' '{print $2}' | iconv -f utf-8 -t cp1251 | read TAG
#      но это почему-то не работает((
    TAG=${TAG%".mp3"}
    id3v2 --song "$TAG" "$NAME"

#      если задан аргумент - то пишем значение для исполнителя.
#      проблема с pipe - та же
    if [ $# -eq 1 ]
    then
        echo "$1" | iconv -f utf-8 -t cp1251 > tmp
        read TAG < tmp
        id3v2 --artist "$TAG" "$NAME"
    fi
#      отображаем количество переконвертированных файлов
    progress_bar $__PROGRESS
done
echo
#      удаляем временный файл
rm -r tmp
Спасибо сказали:
beholder
Сообщения: 29

Re: проблема с pipe

Сообщение beholder »

Дело в том, что каждая команда конвейера выполняется в отдельном процессе (subshell) и поэтому не может изменить переменные своего родителя.
Спасибо сказали:
beholder
Сообщения: 29

Re: проблема с pipe

Сообщение beholder »

Если не нравится временный файл, то можешь сделать так:

TAG=$(echo $TAG | awk -F'[-]' '{print $2}' | iconv -f utf-8 -t cp1251)
Спасибо сказали: