我正在尝试编写一个脚本,该脚本可在远程和本地计算机上生成多个长时间运行的命令。目前,我的解决方案的一个示例是:
#!/bin/bash
ssh -t [email protected] tmux new -s remote -d "find / *"
tmux new -s local -d "find / *"
但是,当这些命令变得更加复杂(长而带有引号的链式命令,而不仅仅是单个find
命令)时,将它们放在一行上并转义所有嵌套的引号会变得混乱。
我曾尝试使用 SSH 和所谓的“此处文档”,例如:
ssh -t [email protected] << EOF
tmux new -s remote -d "find / *"
EOF
tmux new -s local -d "find / *"
但这会导致not a terminal
SSH 的 -T 或 -t 选项出现错误,或者在使用 -tt 选项时出现一些非常奇怪的行为。
有什么建议可以优化/彻底改变我的方法吗?
答案1
我认为你应该能够结合这个想法和这个其他想法并得到这样的工作:
CMDS=$(cat <<CMD
read -e -p "Enter the path to the find: " FILEPATH
echo \$FILEPATH
#find \$FILEPATH -name $FILENAME
#read -p done:
CMD
)
tmux new -s finder -n remote "ssh localhost -t '$CMDS'" \; \
new-window -n local "bash -c '$CMDS'" \; \
attach \;
额外好处——两个命令在同一个会话中并行运行tmux
。
根据您要执行的命令的复杂性,可能仍存在一些引用和转义问题。另请注意,read -p done
或您的命令将执行、终止,并且tmux
也将终止,而您看不到输出。也许这就是您想要的,而使用find
仅仅是举例。