当我使用以下命令启动 xterm 时:
xterm -e 'cd ~' -hold
会弹出一个新的 xterm 窗口,显示:xterm: Can't execvp cd ~: No such file or directory
之后 xterm 窗口仍位于我的当前目录中,我可以在其中cd ~
手动运行,其行为符合预期。有什么想法可能会导致这种情况吗?或者是否有另一种方法可以更改 xterm 的起始目录。
我正在运行 Ubuntu 20.04.4 LTS
答案1
( cd && xterm )
为命令设置正确的工作目录的最常见方法是在cd
调用命令之前进行设置。在子 shell 中执行此操作可确保调用 shell 的工作目录不会更改。
此答案顶部的命令启动一个子 shell,然后用于cd
将工作目录更改为当前用户的主目录。如果成功,xterm
则调用。当xterm
不带 调用时-e
,默认情况下会启动交互式 shell。
xterm
终止时(如果失败则立即) ,控制权将返回给调用 shell cd
。xterm
只要正在运行的命令终止,即交互式 shell 完成时,终端就会终止。&
在末尾使用可xterm
在后台启动子 shell。
答案2
查看man xterm
该选项的记录位置-e
(强调我的):
-e 程序 [ 参数 ... ]
该选项指定要在 xterm 窗口中运行的程序(及其命令行参数)。如果命令行上未给出 -T 和 -n,它还会将窗口标题和图标名称设置为正在执行的程序的基本名称。
注意:这必须是命令行上的最后一个选项。
如您所见,-e
必须是命令行上传递的最后一个选项。所以xterm -hold -e 'cd ~'
会起作用,它只是无用的,因为终端将运行cd
然后立即退出 shell 会话,因为这意味着-e
:运行命令并退出。
所以你需要两者cd
和启动一个新的外壳。所以试试这个:
xterm -hold -e 'cd ~; bash'
斯蒂芬·查泽拉斯我在此处复制的评论中提出了一个非常好的观点:
请注意,使用 时
xterm -hold -e 'cd ~; bash'
,xterm 仍会尝试运行名为 的命令cd ~; bash
。它可能会失败,但在这种情况下,因为我们处于一种不明确的情况,即在 后仅传递一个参数-e
,所以它会退回到使用$SHELL
和-c
作为cd ~; bash
参数执行。在这里,为了消除这种歧义,您应该这样做xterm -hold -e sh -c 'cd && exec bash'
。另请参阅xterm -hold -e env -C ~ bash
一些env
实现。
所以,更好地使用:
xterm -hold -e sh -c 'cd && exec bash'