当我在运行 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
还替换rm
为tmux
:
➜ 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
。在这种情况下,是tmux
AppImage 正在设置变量。
根据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
排除任何导致麻烦的环境变量。