Skip to contentSkip to conversation

tmux new does not take tw commands

PATCH In review Peter Seebach 2 participants 3 messages Jun 11, 2013

lore
Share & tools
lore
#0 lore raw

cover tmux new does not take tw commands

This got routed to me because the visible error message says
Execution of "pseudo /bin/bash" failed

but actually it's nothing to do with pseudo. The real problem is that the tmux class in terminal.py is producing a string like:
'tmux new <args> {command}'

This then gets .format called on it, substituting in a command. If the comand is "pseudo /bin/bash", this is:
'tmux new <args> pseudo /bin/bash'
which is a usage error. It would be okay if it were:
'tmux new <args> "pseudo /bin/bash"'

So add double quotes. Of course, that assumes that <command> never has double quotes in it... If it does, that may need a fancier solution.

The following changes since commit b4f208f418d18f2a4e78a56bebacef481061d917:
Saul Wold (1):
tar: don't mv tar for nativesdk

are available in the git repository at:

git://git.yoctoproject.org/poky-contrib seebs/tmuxfix
http://git.yoctoproject.org/cgit.cgi/poky-contrib/log/?h=seebs/tmuxfix

Peter Seebach (1):
handle two-word commands with tmux

 meta/lib/oe/terminal.py |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)
#1 lore raw

PATCH 1/1 handle two-word commands with tmux

Trying to make a devshell using tmux can fail because "tmux new" expects a single command, not a series of arguments. It does, however, split strings in a suitable way. So you can quote the command.

The failure mode is particularly arcane, in that you end up with a message like:

	ERROR: Unable to spawn terminal auto: \
	Execution of 'pseudo /bin/bash' failed with exit code 1:
	usage: new-session [-d] [-n window-name] [-s session-name] \
	[-t target-session] [command]

which is confusing because there's no "new-session" anywhere in sight (that's actually "tmux new"), and because what failed to execute wasn't either pseudo or bash.

---
 meta/lib/oe/terminal.py |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)
meta/lib/oe/terminal.py +2 -2
index 28470e3..25f8004 100644
@@ -122,7 +122,7 @@ class TmuxRunning(Terminal):
 
 class Tmux(Terminal):
     """Start a new tmux session and window"""
-    command = 'tmux new -d -s devshell -n devshell {command}'
+    command = 'tmux new -d -s devshell -n devshell "{command}"'
     priority = 0.75
 
     def __init__(self, sh_cmd, title=None, env=None, d=None):
@@ -133,7 +133,7 @@ class Tmux(Terminal):
         # devshells, if it's already there, add a new window to it.
         window_name = 'devshell-%i' % os.getpid()
 
-        self.command = 'tmux new -d -s {0} -n {0} {{command}}'.format(window_name)
+        self.command = 'tmux new -d -s {0} -n {0} "{{command}}"'.format(window_name)
         Terminal.__init__(self, sh_cmd, title, env, d)
 
         attach_cmd = 'tmux att -t {0}'.format(window_name)
Signature · 1 line
1.7.0.4
#2 lore raw
In reply to Peter Seebach
Quoted 8 lines · Peter Seebach

This got routed to me because the visible error message says
Execution of "pseudo /bin/bash" failed

but actually it's nothing to do with pseudo. The real problem is that the tmux class in terminal.py is producing a string like:
'tmux new <args> {command}'

Quoted 9 lines

This then gets .format called on it, substituting in a command. If the comand is "pseudo /bin/bash", this is:
'tmux new <args> pseudo /bin/bash'
which is a usage error. It would be okay if it were:
'tmux new <args> "pseudo /bin/bash"'

So add double quotes. Of course, that assumes that <command> never has double quotes in it... If it does, that may need a fancier solution.

I'd suggest calling pipes.quote() on the value being passed into format().

Signature · 1 line
Christopher Larson