2013-03-05 7 views
1

У меня есть сценарий, который я запускаю на двух компьютерах. Первая строка кода выглядит следующим образом:Альтернативные интерпретаторы для скрипта

#!/usr/bin/gnuplot -p 

На втором компьютере, я хочу использовать версию GNUPLOT хранящийся в $HOME/bin/gnuplot.

$HOME/bin входит в $PATH переменного второго компьютера, поэтому я попытался начать сценарий с общим вызовом GNUPLOT:

#!gnuplot -p 

, но это не сработало, потому что сценарий затем искал ./gnuplot.

Есть ли способ сделать строку заголовка одинаковой для обоих компьютеров? Я бы предпочел, чтобы решение каким-то образом содержалось в одной строке, без необходимости сценария для разграничения между компьютерами или для меня, чтобы сказать, на каком компьютере он включен.

ответ

1

#!/usr/bin/env gnuplot делает его более portable.

+0

Wrikken, это работает просто отлично! Но ... я был _actually_, вызывая 'gnuplot -p', но удалил флаг, чтобы упростить вопрос. Когда я пытаюсь '#!/Usr/bin/env gnuplot -p', он сообщает мне, что такого файла или каталога нет. Есть ли способ обойти это? Я использую Linux. – Richard

+0

Я прочитал список рассылки [здесь] (http://mail-index.netbsd.org/netbsd-users/2008/11/10/msg002390.html) и вижу, что есть достойные причины, по которым я могу ожидать слишком много '/ usr/bin/env' и' #! 'в целом. Тем не менее, было бы неплохо, если бы это сработало. – Richard

+1

Не в shebang AFAIK, но я понимаю, что вы можете создать файл '.gnuplot', который устанавливает терминал по умолчанию и его постоянство. – Wrikken

0

Очевидное решение

#!/usr/bin/env gnuplot 

См this question и my answer для некоторого обсуждения преимуществ и недостатков этого метода.

Но в вашем случае вам необходимо передать аргумент -p в gnuplot - и строка #! не обрабатывает этот синтаксис. Вы можете использовать

#!/usr/bin/gnuplot -p 

но если вы попробуете:

#!/usr/bin/env gnuplot -p 

это, вероятно, попытается выполнить что-то по имени gnuplot -p, который, конечно, не существует (она проходит "gnuplot -p" как один аргумент в /usr/bin/env) ,

Решение, которое я использовал, - это написать сценарий установки, который изменяет линию #! для каждой системы. Выяснить, как это сделать, остается как упражнение.

Если ваш домашний каталог имеет тот же полный путь к файлу на обоих компьютерах, вы можете сделать это:

#!/home/yourname/bin/gnuplot -p 

На компьютере, где gnuplot живет в $HOME/bin, это именно то, что вы хотите. С другой, где вы хотите использовать /usr/bin/gnuplot, создать $HOME/bin/gnuplot в качестве символической ссылки на /usr/bin/gnuplot:

ln -s /usr/bin/gnuplot ~/bin/gnuplot 

Если вы не хотите возиться с $HOME/bin каталог на обеих машинах, или если ваш $HOME имеет различное полное имя пути, выберите другой каталог.Например, вы можете установить его в /tmp/yourname/bin на обеих машинах:

mkdir -p /tmp/yourname/bin 
ln -s /usr/bin/gnuplot /tmp/yourname/bin/gnuplot # on one machine, OR 
ln -s ~/bin/gnuplot /tmp/yourname/bin/gnuplot # on the other 

и использовать:

#!/tmp/yourname/bin/gnuplot -p 
+0

Спасибо за подробный ответ, Кейт. Я решил использовать команду 'set term x11 persist' в моем скрипте, что облегчает проблему с необходимостью аргумента' -p'. – Richard

1

#!/usr/bin/env gnuplot является более портативный способ выражения переводчика, как отметил here и here.

Однако это представляет проблему, которую вы не можете ожидать.

#!/usr/bin/gnuplot -p 

делает постоянное окно GNUPLOT, но работает

#!/usr/bin/env gnuplot -p 

, которые могли бы показаться очевидной портативной альтернативы не работает.

Некоторые причины для этого обсуждаются here, но, похоже, вокруг не существует способа: аргументы и /usr/bin/env действительно не уживаются.

В частном случае -p флага, то лучше всего использовать

#!/usr/bin/env gnuplot 

, а затем включить строку

set term x11 persist 

в вашем GNUPLOT скрипт, который будет делать то же самое.

+0

Как насчет '-c' вызываемого флага передать аргументы в * gnuplot *? – Atcold

+1

Я только что узнал, что * OSX * 'env' поддерживает аргументы ... Тем не менее, Debian не ... – Atcold