2015-06-18 2 views
0

У меня есть скрипт Python, который определяет конфигурацию для tmux, а затем запускает tmux с этой конфигурацией. Конфигурация хранится как heredoc в Python, и я хочу использовать ее в подстановке Bash при выполнении команды запуска Bash для tmux.Как Python heredoc можно использовать в качестве входных данных для замены Bash-процесса?

Итак, я ищу, чтобы сделать что-то вроде этого:

configuration = \ 
""" 
set -g set-remain-on-exit on 
new -s "FULL" 
set-option -g prefix C-a 
unbind C-b 
bind - split-window -v 
bind | split-window -h 
## colours 
set-option -g window-status-current-bg yellow 
set-option -g pane-active-border-fg yellow 
set -g status-fg black 
set -g status-bg '#FEFE0A' 
set -g message-fg black 
set -g message-bg '#FEFE0A' 
set -g message-command-fg black 
set -g message-command-bg '#FEFE0A' 
set-option -g mode-keys vi 
set -g history-limit 5000 
## mouse mode 
set -g mode-mouse on 
set -g mouse-select-pane on 
set -g mouse-select-window on 
set -g mouse-resize-pane on # resize panes with mouse (drag borders) 
## status 
set-option -g status-interval 1 
set-option -g status-left-length 20 
set-option -g status-left '' 
set-option -g status-right '%Y-%m-%dT%H%M%S ' 
## run programs in panes 
# split left-right 
split-window -h 
# split left up 
select-pane -t 0 
split-window -v 
select-pane -t 0 
split-window -v 
select-pane -t 0 
split-window -v 
select-pane -t 3 
split-window -v 
select-pane -t 0 
send-keys 'ranger' Enter 
select-pane -t 1 
send-keys 'clear' Enter 
select-pane -t 2 
#send-keys 'htop' Enter 
select-pane -t 3 
send-keys 'elinks http://arxiv.org/list/hep-ph/new' Enter 
select-pane -t 4 
send-keys 'cmus' Enter 
select-pane -t 5 
send-keys 'ranger' Enter 
select-pane -t 4 
set -g set-remain-on-exit off 
""" 

command = executable + " -f <(echo " + configuration + ") attach" 
os.system(command) 

Что я должен изменить, чтобы получить эту работу?

+0

Что происходит, когда вы пытаетесь это сделать? – cdarke

+0

@cdarke Привет. Когда я запускаю это, я получаю ошибку '' 'sh: 1: Синтаксическая ошибка:" ("неожиданно''. – d3pd

+0

Я думаю, что проблема связана с синтаксисом' <() '.' Os.system() 'работает 'sh' not' bash'. – cdarke

ответ

2

Python's os.system() определен в терминах функции system() C, которая выполняет заданную команду через /bin/sh -c <the command>. Даже если/bin/sh является псевдонимом для bash, когда bash запущен какsh, он работает в режиме POSIX, а POSIX не обеспечивает замену процесса (<(<command>)).

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

command = "config=`mktemp` && { echo \"" + configuration + "\" > $config; " 
     + executable + " -f $config attach; unlink $config; }" 

Кроме того, даже если бы она была доступна для вас, замена процесса Баша является Перенаправлением. Он влияет на стандартный ввод (или стандартный вывод), если процесс запускается и не заменяет имя файла.

+0

Я играл с 'bash -c' и командой, и пришли к такому же выводу. – cdarke

+0

Эй, спасибо за ваше решение. Я понимаю о проблеме Bash/shell сейчас. Возможно, было бы неплохо создать переменную среды Bash для хранения конфигурации, а не временного файла, чтобы избежать ненужный доступ к жесткому диску, но я не совсем уверен, как это сделать, не сталкиваясь с проблемами с экранированием символов с помощью heredoc. – d3pd

+1

@ d3pd, насколько я могу судить, 'tmux' требует, чтобы вы предоставили любую необходимую конфигурацию * в файл *, и он будет считывать из файла конфигурации по умолчанию, если вы не укажете alte с помощью опции '-f'. Я не вижу никакого способа настроить его через среду. По крайней мере, так я читал документы; Я фактически не использую 'tmux'. В чем большая проблема с доступом к жесткому диску? Чтение конфигурационного файла будет чрезвычайно дешевым по сравнению с загрузкой 'tmux'. –

Смежные вопросы