Gnuplot, как установить переменную на стандартный ввод, если она не передана

У меня есть скрипт gnuplot (plot.script), который вызывается как

C:> ffmpeg -i '.\my_awesome_audio_file.wav' -filter_complex aformat=channel_layouts=mono -acodec pcm_s16le -ar 4000 -f data - | gnuplot -e "fileout='plot';fileformat='png';wid=500;" .\plot.script        

Теперь я бы хотел, чтобы переменная filein по умолчанию использовалась для стандартного ввода, если она не передается в качестве аргумента. Это потому, что я хочу иметь возможность вызывать этот скрипт как однострочную команду с генерацией данных ffmpeg, а также как пошаговую процедуру.

Моя идея заключалась в том, чтобы использовать

if(!exists('filein')){
filein = '-';
}

но это выдает warning: Skipping data file with no valid points

если я распечатаю файл переменных данных, я получу - (я ожидал что-то вроде стандартного ввода).

это скрипт plot.script:


if(!exists('filein')){
    filein = '-';
    }

if (!exists("hei")){
    hei = 4444;
    }
if (!exists("wid")){
    wid = 5555;
    }
if(!exists("fileformat")){
     fileformat = 'png';
     }
if(!exists("fileout")){
     fileout = 'risultato';
   }
   
fileout = fileout . '.' . fileformat;
   
if(!exists("dataformat")){
    dataformat = '%int16';
    }
if(fileformat eq 'png'){
  set terminal png transparent size larghezza,altezza;
  
  }else{
  set terminal fileformat size wid,hei;
  }
  set output fileout;
  unset key;
  unset tics;
  unset border;
  set lmargin 0;
  set rmargin 0;
  set tmargin 0;
  set bmargin 0;


print filein;
plot filein binary filetype=bin format=dataformat endian=little array=1:0 with lines linecolor "0x009900";

Но я также хочу вызвать эту команду по команде: сгенерировать файл данных:

c:> ffmpeg -i '.\my_awesome_audio_file.wav' -filter_complex aformat=channel_layouts=mono -acodec pcm_s16le -ar 4000 -f data audio.dat

построить данные:

c:> gnuplot -e "filein='audio.dat';fileout='plot';fileformat='png';wid=500;" .\plot.script

person DDS    schedule 27.08.2020    source источник


Ответы (1)


Вероятно, есть много способов справиться с этим, но я предлагаю сделать график gnuplot из канала, открытого вызывающей его командой оболочки. Затем оболочка должна заполнить этот канал либо через cat из существующего файла, либо направив в него поток. Вот соответствующий раздел из документации (см. help pipes)

 On systems with an fdopen() function, data can be read from an arbitrary file
 descriptor attached to either a file or pipe.  To read from file descriptor
 `n` use `'<&n'`.  This allows you to easily pipe in several data files in a
 single call from a POSIX shell:

       $ gnuplot -p -e "plot '<&3', '<&4'" 3<data-3 4<data-4
       $ ./gnuplot 5< <(myprogram -with -options)
       gnuplot> plot '<&5'
person Ethan    schedule 27.08.2020