gnuplot: Você pode definir variáveis ​​de shell em um script e depois chamá-las?

Sep 10 2020

Eu quero ser capaz de emitir comandos shell a partir de um script gnuplot, como definir uma variável, mas parece que o systemcomando gera uma nova instância shell em vez de emitir comandos para a instância shell que está executando o script gnuplot. Veja o script a seguir, onde a primeira linha permite a atribuição de $foo, mas a segunda linha não pode acessar essa variável. Neste caso, $fooé atribuído como uma string arbitrária em oposição a uma referência ao diretório, portanto, o\"

#!/usr/bin/gnuplot -p
system "export foo=\"$HOME/path/to/dir\";echo $foo"
system "echo $foo" set datafile separator "\t" #plot "`echo $foo`/bar.dat" using 2:3
plot "<( sed '5p' $foo/bar.dat )" using 2:3

Respostas

3 Quasímodo Sep 09 2020 at 23:47

Você está certo: Cada systemcomando emite um novo shell, então a variável definida com system "foo=bar"desaparece quando o Gnuplot vai para a linha seguinte.

Uma abordagem muito conveniente no seu caso é usar here-docs .

foo="$HOME/path/to/dir" gnuplot -p<<EOF set datafile separator "\t" plot '<(sed "5p" "$foo"/bar.dat)'
EOF

Algumas notas sobre o script:

  • sed "5p" filesignifica que todas as linhas do arquivo serão plotadas, mas a 5ª linha será duplicada. Se você pretendia representar apenas a 5ª linha, usesed -n "5p" file

  • Isso chama o Gnuplot, mas ainda é um script de shell, portanto, é melhor sempre citar variáveis (como "$foo") para evitar a divisão de palavras.