2017-02-08 19 views
0

Я хочу, чтобы обрабатывать кучу wav-файлов с помощью SoX (для настройки их объема). У меня возникла проблема с назначением вывода Volume Adjustment с sox file.wav -n stat -v. Я пробовал с этим:

Я нашел много примеров в Интернете об этой операции, но эти примеры не так сложны, как data=$(data). Я пробовал VOLUME_ADJUST="$(sox $1 -n stat -v)", но результат вывода на мой терминал не присваивался переменной. Когда я повторяю, ничего не появляется.

Спасибо за ваше предложение. Мой код выглядит следующим образом:

#!/bin/sh 

RED='\033[0;31m' 
NC='\033[0m' 
BLUE='\033[0;34m' 
GREEN='\033[0;32m' 

Process() { 
    printf "Process with ${RED}$1${NC}\n"; 
    printf "Volume up as high as possible?[y/n]"; 
    read PASS; 
    if test "$PASS" = "y"; then 
     a="$(date)" 
     VOLUME="$(sox "$1" -n stat -v)" 
     #echo $VOLUME 
     # eval "sox -v $VOLUME_ADJUST $1 $1" 
     #printf $? 
    elif test "$PASS" = "n"; then 
     printf "${GREEN}Volume up skipped.${NC}" 
    fi 
} 

Process "test.wav" 

Here is a pastebin to all of my code

+1

Я уверен, что 'sox' выводит вывод на стандартную ошибку, а не на стандартный вывод. Вероятно, это дубликат, но сейчас я рисую пустоту. Для решения см., Например, http://stackoverflow.com/questions/962255/how-to-store-standard-error-in-a-variable-in-a-bash-script – tripleee

+0

@tripleee Спасибо! 'VOLUME = $ ({sox $ 1 -n stat -v;} 2> &1);' отлично работает –

+0

Вам не нужны скобки для одной команды. – tripleee

ответ

0

Вот мое понимание.

По какой-то причине sox печатает данные в stderr, но не stdout. Когда мы получаем значение из команды, как var=$(date), сообщение от stdout присваивается переменной, но сообщение из stderr не будет назначено. Чтобы получить значение, легко перенаправить stderr в stdout: просто добавьте 2>&1 после команды. В добавлении мы можем направить stdout на stderr, например, var=$(date 1>&2) результат напечатан и ничего в $var, если мы его эхо.