带有tmux发送键的BASH功能

mah*_*off 4 bash tmux

我在将"发送密钥"放入bash函数时遇到问题.这是一个最小的例子:

function keys {
  tmux send-keys -t work:1 $*
}

tmux new-session -d -s work
keys "pwd" c-m "ls -latr" c-m
tmux attach-session -t work
Run Code Online (Sandbox Code Playgroud)

这里的keys参数正是我在命令行上键入的参数tmux send-keys.它几乎可以工作,但剥离空间,所以我把ls-latr所有都视为一个单词.但是如果我$*在函数中放置引号,它只会在一行上输出整个键参数(将其c-m视为文字字符).我怎么能让它执行send-keys参数,好像我是从命令行输入的?

Chr*_*sen 13

你应该使用"$@"(引号很重要)而不是$*你的shell函数; 它将保留与函数调用中提供的位置参数完全相同的位置参数.

function keys {
  tmux send-keys -t work:1 "$@"
}
Run Code Online (Sandbox Code Playgroud)

使用"$@",最后的命令将获得四个原始参数:

tmux send-keys -t work:1 'pwd' 'c-m' 'ls -latr' 'c-m'
Run Code Online (Sandbox Code Playgroud)

而不是未引用的五个$*:

tmux send-keys -t work:1 pwd c-m ls -latr c-m
Run Code Online (Sandbox Code Playgroud)

或者来自"$*":

tmux send-keys -t work:1 'pwd c-m ls -latr c-m'
Run Code Online (Sandbox Code Playgroud)

如果没有引用,$*并且$@实际上是相同的,但是当用双引号引用它们时它们明显不同.

  • $*而且$@就像$1 $2 $3 …

    所得到的数值会随时分词和文件名扩展(又名通配符),所以你平时没有希望没有双引号使用这些(或任何其他参数扩展).

    额外的单词拆分是你"ls -ltr"(一个参数key)成为ls -ltr(两个参数tmux send-keys)的原因.

  • "$*" 就好像 "$1 $2 $3…"

    所有位置参数值都连接成一个单词"word"(字符串),以防止进一步的单词拆分和通配.

    放在每个位置参数值之间的字符实际上是IFS中的第一个字符; 这通常是一个平坦的空间.

  • "$@" 就好像 "$1" "$2" "$3" …

    每个位置参数都被扩展为一个单独的单词,并且它们可以防止进一步的单词拆分和通配.