tarabyte Asked: 2019-12-04 11:05:35 +0800 CST2019-12-04 11:05:35 +0800 CST 2019-12-04 11:05:35 +0800 CST 如何在`tmux send-keys`中扩展shell变量? 772 我正在尝试编写一个小实用程序脚本,以便使用自定义 tmux 窗口更轻松地开始我的一天。在 tmux 发送它的密钥之前,我的变量似乎没有被评估,但是: #!/bin/bash MY_WORKSPACE=/users/me/someproject tmux send-keys 'cd ${MY_WORKSPACE}' 'C-m' cd ${MY_WORKSPACE}因为 MY_WORKSPACE 没有被变量内容替换,所以出错了。 bash tmux 2 个回答 Voted Kamil Maciorowski 2019-12-04T13:30:50+08:002019-12-04T13:30:50+08:00 MY_WORKSPACE在脚本中定义,但(很可能)不在接收您通过tmux send-keys. 该变量在脚本中被单引号引起来,所以它没有被扩展。tmux 中的 shellcd ${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}扩展为一个字符串,该字符串在被解释时将原始字符串重新创建为一个单词。您甚至不需要额外的单引号,它们将在变量扩展期间添加。 Best Answer Nicholas Marriott 2019-12-04T11:08:03+08:002019-12-04T11:08:03+08:00 将其放在双引号中:“cd $MY_WORKSPACE”...
MY_WORKSPACE
在脚本中定义,但(很可能)不在接收您通过tmux send-keys
. 该变量在脚本中被单引号引起来,所以它没有被扩展。tmux 中的 shellcd ${MY_WORKSPACE}
从字面上看,就好像您输入了它一样。未定义的变量被扩展为空。您需要在脚本中用双引号引起来,以便在此处展开变量。它的内容将被输入到 tmux 的 shell 中。然后它会被解释。
在您的情况下,变量扩展为
/users/me/someproject
. 该字符串不包含空格或其他麻烦的字符。这个其他答案的解决方案将适用于这个字符串。就像是:一般来说,这段代码很差。您至少应该单引号引用扩展的内容:
(我为变量使用了小写名称,因为这是一个很好的做法。)目标 shell 将在单引号中接收扩展的变量内容。这将防止分词、通配符和
$
(如果有的话)等的进一步扩展。变量内容中的文字单引号可能会破坏命令,甚至注入任意命令。有办法避免这种情况。Bash 本身提供了一个方便的解决方案:${my_workspace@Q}
扩展为一个字符串,该字符串在被解释时将原始字符串重新创建为一个单词。您甚至不需要额外的单引号,它们将在变量扩展期间添加。将其放在双引号中:“cd $MY_WORKSPACE”...