如何在“tmux send-keys”中扩展 shell 变量?

如何在“tmux send-keys”中扩展 shell 变量?

我正在尝试编写一个小实用程序,以便更轻松地使用自定义 tmux 窗口开始我的一天。然而,在 tmux 发送其键之前,我的变量似乎没有被评估:

#!/bin/bash
MY_WORKSPACE=/users/me/someproject
tmux send-keys 'cd ${MY_WORKSPACE}' 'C-m'

发生cd ${MY_WORKSPACE}错误,因为 MY_WORKSPACE 尚未被变量内容替换。

答案1

将其放在双引号中:“cd $MY_WORKSPACE”...

答案2

MY_WORKSPACE在脚本中定义,但(很可能)不在接收您通过 发送的键的 shell 中tmux send-keys。变量在脚本中用单引号引起来,因此不会展开。tmux 中的 shell 会cd ${MY_WORKSPACE}按字面意思理解,就像您输入它一样。未定义的变量会展开为空。

您需要在脚本中用双引号括住该字符串,以便变量在那里展开。其内容将是打字进入 tmux 中的 shell。然后它将解释

在您的例子中,变量扩展为/users/me/someproject。此字符串不包含空格或其他麻烦的字符。解决方案来自另一个答案将使用此字符串。就像:

# flawed
tmux send-keys "cd $MY_WORKSPACE" 'C-m'

一般来说这段代码很糟糕。你至少应该用单引号括住扩展的内容:

#!/bin/bash
my_workspace='/users/me/some project with spaces'
# still somewhat flawed in general
tmux send-keys "cd '$my_workspace'" 'C-m'

(我使用小写名称作为变量,因为它是良好做法.) 目标 shell 将在单引号中接收扩展的变量内容。这将防止单词拆分、通配符和进一步扩展$(如果有)等。变量内容中的文字单引号仍然可能会破坏命令,甚至注入任意命令。有办法避免这种情况。Bash 本身提供了一个方便的解决方案:

#!/bin/bash
my_workspace="with spaces \$foo['\" and various characters"
# safe
tmux send-keys "cd ${my_workspace@Q}" 'C-m'

${my_workspace@Q}扩展为一个字符串,在解释时将原始字符串重新创建为一个单词。您甚至不需要额外的单引号,它们将在变量扩展期间添加。

相关内容