使用 Zsh 时,与执行命令相关的终端消息被“tmux”替换

使用 Zsh 时,与执行命令相关的终端消息被“tmux”替换

当我在运行 tmux 安装并运行出错的命令时,有时tmux会替换原始命令的名称。

即,如果test是一个目录,则会发生以下情况:

jameswright in ~ at portal1 via ⬢ v12.13.0           
➜ rm test                                     
tmux: cannot remove ‘test’: Is a directory

cp请注意,使用或时不会发生此行为ls。这是在使用 Zsh 的 Linux 上。在 中使用 Bash 和 时不会发生此问题.tmux.conf,因为default-command和 均未default-shell设置。

但是,如果我在命令前加上env -i— 如env -i rm test— 我就能正确地看到rm命令而不是tmux

➜ env -i rm test
rm: cannot remove 'test': Is a directory

另外,如果我尝试strace调试问题 - 使用strace -fostrace.out rm test- 我也能正确地rm看到tmux

➜ strace -fostrace2.out rm test
rm: cannot remove 'test': Is a directory

任何想法如何这可能发生吗?

我认为错误消息应该是由有问题的命令生成的,但这似乎表明并非如此。

运行/bin/rm test— 使用完整的二进制路径 — 具有与上述相同的结果。

此外,rm --help还替换rmtmux

➜ rm --help
Usage: tmux [OPTION]... FILE...
Remove (unlink) the FILE(s).

  -f, --force           ignore nonexistent files and arguments, never prompt
....
....
To remove a file whose name starts with a '-', for example '-foo',
use one of these commands:
  tmux -- -foo

  tmux ./-foo

答案1

问题是ARGV0环境变量为tmux。在这种情况下,是tmuxAppImage 正在设置变量。

根据AppImage 文档$ARGV0变量设置为执行 AppImage 时调用的名称/路径。因此运行tmux将设置ARGV0=tmux

但是,开始tmux使用 AppImage 的绝对路径/users/jameswright/.local/bin/tmux会出现以下情况:

➜ rm test
/users/jameswright/.local/bin/tmux: cannot remove ‘test’: Is a directory

unset ARGV0立即修复此问题以便在 tmux 会话中运行。

此问题已在tmux 应用图像否则,提取 AppImage并且调用提取的二进制文件本身也可以解决该问题。

答案2

我在 rm 源代码中没有看到任何明显的东西。有趣的是,这在 bash 中不会发生。

运行以下命令查看是否可以重现:

/bin/rm test

这肯定会排除任何包装脚本或别名。

如果仍然发生这种情况,您可以安装 strace 并运行,例如:

strace -fostrace.out rm test

您可能能够查看 strace.out 并查看它是否被传递 tmux 作为其第一个参数(我认为它是前几行)。

也许还可以检查是否rm --help也显示 tmux。

另一件值得检查的事情是:env -i rm test排除任何导致麻烦的环境变量。

相关内容