составная команда с bash -c в tmux vs screen

Мне нужно запустить команду с bash -c в сеансе tmux из сценария оболочки. В отличие от screen, tmux, по-видимому, требует заключать в кавычки всю команду, что приводит к проблемам, поскольку bash -c также требует заключения в кавычки для правильной работы с более сложными командными строками.

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

Минимальный скрипт для экрана:

#!/bin/bash

set -x

CMD="ls -l; sleep 5"

screen -d -m bash -c "$CMD"

При выполнении этого скрипта вы получаете (stdout из-за -x)

+ CMD='ls -l; sleep 5'
+ screen -d -m bash -c 'ls -l; sleep 5'

Команда сна предназначена для того, чтобы иметь время подключиться к сеансу экрана и посмотреть, что произойдет. При подключении к сеансу экрана после выполнения вышеуказанного скрипта видно, что вывод команды ls имеет формат длинного списка, т.е. команда выполняется правильно.

В tmux кажется, что нужно заключать команду в кавычки, чтобы она выполнялась в новом сеансе. Я использую следующий скрипт:

#!/bin/bash

set -x

CMD="ls -l; sleep 5"

tmux new -d "bash -c $CMD"

стандартный вывод

+ CMD='ls -l; sleep 5'
+ tmux new -d 'bash -c ls -l; sleep 5'

Как видите, последовательность cmd для bash -c больше не цитируется должным образом. При подключении к созданному сеансу tmux можно увидеть, что это приводит к выполнению ls без распознавания опции длинного списка.

Что я могу сделать, чтобы получить правильное цитирование (т. е. одинарные кавычки вокруг расширенной строки) для строки $CMD, переданной в bash -c?

Обновлять

Побег, как предложил Эрик Ренуф, с \"$CMD\" производит

tmux new -d 'bash -c "ls -l; sleep 5"'

и экранирование с помощью '$CMD' производит

tmux new -d 'bash -c '\''ls -l; sleep 5'\'''

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

Вот точный вызов, который я делаю (см. здесь для всех кровавых подробностей):

$SCREEN -S "scalaris_$NODE_NAME" -d -m bash -x -f +B -c "$START_CMD; sleep 365d"

который производит (выход -x)

/usr/bin/screen -S [email protected] -d -m bash -x -f +B -c '"/usr/bin/erl" -setcookie "chocolate chip cookie" -pa /home/jvf/code/scalaris/contrib/yaws/ebin -pa /home/jvf/code/scalaris/contrib/log4erl/ebin -pa /home/jvf/code/scalaris/ebin   -sasl sasl_error_logger false -yaws embedded true -scalaris log_path "\"/home/jvf/code/scalaris/log/[email protected]\"" -scalaris docroot "\"/home/jvf/code/scalaris/docroot\"" -scalaris config "\"/home/jvf/code/scalaris/bin/scalaris.cfg\"" -scalaris local_config "\"/home/jvf/code/scalaris/bin/scalaris.local.cfg\"" -connect_all false -hidden -name [email protected]   -scalaris start_type first -scalaris port 14195 -scalaris yaws_port 8000 -scalaris join_at_list '\''[0]'\'' -scalaris start_mgmt_server true -scalaris nodes_per_vm "1" -s scalaris +sbt db +swt low +sbwt short'

Я думаю, что решения, предложенные до сих пор, не работают из-за использования двойных кавычек внутри команды, но я не уверен в этом на 100%. Как я могу воспроизвести точное отображение экрана цитирования (одинарные кавычки вокруг полной команды, переданной bash -c) с помощью tmux?


person jvf    schedule 26.08.2015    source источник
comment
Вы можете прочитать здесь о некоторых трудностях, связанных с этим, хотя я бы не предвидел заранее, что у tmux будет больше проблем, чем у screen   -  person Eric Renouf    schedule 27.08.2015


Ответы (1)


Я полагаю, что вам нужно сделать это для tmux, но чтобы получить дополнительные кавычки, которые вы хотите, вы можете просто избежать их во внешней кавычке, например:

tmux new -d "bash -c \"$CMD\""

или вы можете поместить их в одинарные кавычки в большинстве случаев, например

tmux new -d "bash -c '$CMD'"

так как $CMD будет расширен внешними кавычками

person Eric Renouf    schedule 26.08.2015
comment
Это работает для минимального примера, который я привел выше, но не дает точно такого же цитирования и, к сожалению, не работает для того, чего я пытаюсь достичь... - person jvf; 27.08.2015